十分钟学会Lua一:基本语法&基础类型

一:基本语法&基础类型

1、 在lua中大小写是区分的。

      在lua中表达式之间的换行无意义

      注释使用--[[…   --]]

      序列长度获取符#,对于字符来说,该符号返回字符串所占的字节数,对于表来说,返回表对应序列的长度。如:for i=1,#a do…

2、 数值:(1)分为两种,integer即64位整型、float即双精度浮点类型

                 (2)整型和双精度浮点类型都是[number],数值相同的可以直接转换。

                 (3)运算支持加减乘除(+-*/)、取模(%)、幂运算(^)

                   (4)数学函数库math,包括三角函数库(sin\cos\tan)、max、min、伪随机函数random、常量pi\huge(表无限大inf)、取整函数floor和ceil.(5)数值表示范围:1、回环概念:math.maxinteger+1==math.mininteger; math.mininteger-1==math.maxinteger 2、理解精度的限制:1/7*7=0.999999994

3、 字符串:(1)字符串可以表示单个字符,也可表示多字符,每个字符占8个bit。

                     (2)字符串是不可变值。

                     (3)字符转连接可以使用“..”,如“hi”..”achevery”

                       (4)字符串标准库:string.len string.reverse string.lower string.upper string.format(“x=%f”,200)

4、表: 表作为lua特有的数据结构。使用表,lua可以以简单的方式表示数组、集合等其他数据结构。

     (1) a={} 建立空的表

      (2)a[x]=10与a.x=10的效果是一样的

      (3)表标准库:1、table.insert 向序列的指定位置插入一个元素,后续元素依次后移。如table.insert(t,1,10)在表数组头部插入10数值。2、table.remove 删除并返回序列指定位置的元素,如table.remove(t,1)可以将数组的第一个值移除。3、table.move(a,b,c,d) 调用该函数可以将表a中从索引f到e的元素(包括索引f和索引e对应的元素本身)移动到位置t上。如下代码可以在列表a的开头插入一个元素:

     Table.move(a,1,#a,2)    a[1]=newElement

注意:如下列代码

i=10, j=”10”

a[i]=”number key” a[j]=”string key”

此时利用索引调用值时最好标明索引类型,如:a[tonumber(i)]

5、 函数:(1)举例:function add(a)

                  local sum=0

                  for i=1,#a do

                    sum=sum+a[i]

                  end

                  return sum

                end

      (2) lua语言也有面向对象风格的调用,如o:foo(x)的表达式意为调用对象o的foo方法。

   (3)一个lua程序既可以调用lua语言编写的函数,也可以调用C语言编写的函数。

   (4)lua语言允许一个函数返回多个结果。

   (5)lua语言中的函数可以是可变长参数函数,即支持数量可变的参数。函数定义格式参考function add(…).除此之外,还有个函数十分有用,即table.unpack(a),unpack会返回a中所有的元素,然后这些元素被用作f的参数。

     (6)尾调用(tail call)是指被当作函数调用使用的跳转。即,当一个函数的最后一个动作是调用另一个函数而没有再进行其他工作时,就形成了尾调用。如 function f(x) x=x+1; return g(x) end. Lua语言是支持尾调用消除的。即,刚才的函数,当g返回时,程序的执行路径会直接返回到调用f的位置。在尾调用之后,程序不会在调用栈中保存有关调用函数(f(x))的任何信息。利用这个特点,使得在进行尾调用时不使用额外的栈空间。所以,就不会出现栈溢出的现象。

6、输入输出:由于Lua语言强调可移植性和嵌入性,所以Lua语言本身并没有提供太多与外部交互的机制。在真实的Lua程序中,从图形、数据库到网络的访问等大多数I/O操作,要么由宿主程序实现,要么通过不包括在发行版中的外部库实现。

 (1)对于文件操作来说,I/O库提供了两种不同的模型。一是简单I/O模型:io.write()、io.read()。Io.write():该函数可以读取任意数量的字符串(或者数字)并将其写入当前输出流,如:io.write(string.format(“sin(3)=%.4f\n”,math.sin(3)))。io.read():该函数可以从当前输入流中读取字符串,其参数决定了要读取的数据。其中,io.read(“a”):读取整个文件;io.read(“l”)读取下一行(丢弃换行符);io.read(“L”)读取下一行(保留换行符);io.read(“n”)读取一个数值;

Io.read(num)以字符串读取num个字符。

   举例说明: t=io.read(“a”)                  --读取整个文件

              t=string.gsub(t,”bad”,”good”)     --进行处理

              io.write(t)                      --输出结果

   如果要逐行迭代一个文件,使用io.lines迭代器会更方便,举例说明:

              local count = 0

              for line in io.lines() do

                 count=count+1

                 io.write(string.format(“%6d”,count),line,”\n”)

              end

     (2)除了简单I/O模型,二是完整I/O模型。其实在读到简单模型时,你可能就产生了简单模型中命令并没有涉及打开关闭文件的命令。io.open(“a”,”r”):打开一个文件,其中第一个参数是待打开的文件名,第二个是模式参数,包括:表示只读的r,表示只写的w,表示追加的a,以及表示打开二进制文件的b。

io.open返回对应文件的流。在打开文件后,可以使用方法read和write从流中读取和向流中写入。举例说明:

local f=io.open(filename,”r”)

local t=f:read(“a”)

f:close()

注意:io.read(args)实际上是io.input():read(args)的简写,即函数read是用在当前输入流上的。

 7、控制结构:(1)局部变量和代码块:局部变量只要有两个优点:1、可以避免同一程序中不同代码部分中的命名冲突。2、局部变量会随着其作用域的结束而消失,从而使得垃圾收集器能够将其释放。而在Lua中变量默认为全局变量,局部变量在使用前需要声明,如local i=1,局部变量的生效范围仅限于声明它的代码块。在交互模式中,每一行代码就是一个代码块,可以使用一对 do-end作为代码块。

注意:在Lua语言中,循环体内声明的局部变量的作用域包括测试条件。

                       (2)控制结构:1、if then else end,如:if a<b then return a else return b end.如果要编写嵌套的if语句,可以使用elseif,如:if op=1 then r=a+b elseif op==2 then r=a-b elseif op==3 then r=b-a else error(“invalid operation”) end。2、while循环,while a[i] do… end。3、repeat-until,如:local line;repeat line = io.read(); until line ~=”” print(line);3、for循环:for var=exp1,exp2,exp3 do something end.

上一篇:问问题


下一篇:nginx编译lua扩展