lua基础

Lua本身以简单优雅为美, 着眼于处理那些C不擅长的任务. 借助C/C++为其扩展, Lua可以展现无穷的魅力. Lua本身完全遵循ANSI C写成, 只要有C编译器的地方, Lua便可以发挥它的力量. Lua不需要追求python那样大而全的库, 太多的累赘, 反而会破坏她的优美.

— <Lua中文教程>译序

本文章基于lua 5.2.

预备知识

获得lua

lua非常小, 且支持几乎所有的系统. Linux上基本已预装了lua, 其他系统如何获得lua请参考: http://lua-users.org/wiki/LuaBinaries

lua命令行

安装好lua后, 即可使用lua命令行, 它的使用非常简单:

usage: lua [options] [script [args]]
Available options are:
  -e stat  execute string 'stat'
  -i       enter interactive mode after executing 'script'
  -l name  require library 'name'
  -v       show version information
  -E       ignore environment variables
  --       stop handling options
  -        stop handling options and execute stdin

不加任何参数则进入交互式环境.

arg全局变量保存了所有参数, 脚本名索引为0, 脚本参数的索引从1开始, 而脚本之前参数的索引为负数. 比如运行:

$lua -e "print 'hello'" test.lua a b

arg保存的值如下:

arg[-3] = lua
arg[-2] = -e
arg[-1] = print 'hello'
arg[0] = test.lua
arg[1] = a
arg[2] = b

保留关键字

lua的变量命令和C语言一致, 但最好不要使用下划线加大字字母的标识符, 因为这样的标识符一般供内部使用. lua的保留关键字如下:

and     break   do      else        elseif
end     false   for     function    if
in      local   nil     not         or
repeat  return  then    true        until
while

注释

  • 单行注释: –
  • 多行注释 –[[ –]]

Chunk

Chunk就是一系列语句. lua执行的语句块, 比如一个文件交互模式下的每一行就是一个chunk.

数据类型

lua是动态类型语言, 声明变量时不需要指定数据类型.

lua一其有8种基本类型:

  • nil
  • boolean
  • number
  • string
  • userdata
  • function
  • thread
  • table

使用type()函数可以查看给定变量或值的类型.

string

  • 字符串字面值可以用单引号也可以用双引号, 最好保持风格统一
  • 还可以用 [[string]] 这种形式表示字符串, 此时字符串可以包含多行,且不会进行转义
  • lua会在需要时把number和string进行互相转化, 也可以使用tostring()和tonumber()进行显式转换
  • .. 是字符串连接符, 相当于某些语言中的+

警告

  1. 在lua里使用条件判断时, 除了false和nil为假, 其他条件都为真, 所以数字0和空字符串也为真.
  2. string里可以有0, 且是可读的, 要修改必须新建一个变量

userdata

userdata可以将C数据存放在lua变量中, 它除了赋值和相等比较外没有其他操作. userdata用来描述应用程序或者使用C实现的库创建的新类型.

// todo

thread

// todo

表达式

算术运算符

二元: + - * / ^(幂)

一元: -(取负)

关系运算符

lua关系运算符包括:

<   >   <=  >=  ==  ~=

关系运算符的结果是true或false. 对于table, userdata和function, 是通过引用比较的,而不是值比较.

警告

不等于是~=而不是!=

逻辑运算符

lua逻辑运算符包括:

and     or    not

警告

and和or的结果不是true/false, 而是和2个操作数有关, 见下例.

print(4 and 5)      --> 5
print(nil and 13)   --> nil
print(false and 13) --> false
print(4 or 5)       --> 4
print(false or 5)   --> 5

连接运算符

即两个点 .. , 使用时最好在两边加上空格.

运算符优先级

lua运算符优先级从高到低顺序如下:

^
not     - (unary)
*   /
+   -
..
<   >   <=  >=  ~=  ==
and
or

语句

赋值

lua可以一次性给多个变量同时赋值, 变量列表和值列表的各元素用逗号隔开:

a, b = 10, 2*x

lua会先计算赋值语句右边所有的值, 然后再进行赋值操作, 所以在lua里可以通过下面这样来交换两个变量的值:

x, y = y, x

局部变量

可以通过local声明一个局部变量, 它只在被声明的代码块中有效. 访问局部变量比全局变量更快, 并且可以避免命名冲突. 可以把局部变量放在 do..end 中, 就好像C中的{}中一样.

条件语句

lua条件语句主要有3种结构:

if cond then            -- C: if(cond) {
    then-part           --     }
end;

if cond then            -- C: if(cond) {
    then-part           --    }
else                    --    else {
    else-part           --    }
end;

if cond1 then           -- C: if(cond1) {
    then-part           --    }
elseif cond2 then       --    else if(cond2) {
    elseif-part         --    }
..                      --    ..
else                    --    else {
    else-part           --    }
end;

注意if语句后面的then以及最后的end.

循环语句

while:

while cond do       -- C: while(cond) {
    statements;     --    }
end;

repeat-until:

repeat              -- C: do{
    statements;     --    } while(cond)
until cond;

for:

for var=start,end,step do   -- C: for(var=start;var<=end;var+=step) {
    loop-part               --    }
end

警告

  1. for后面的表达式只会在循环开始前被计算1次
  2. 上面的C等价语句其实不完全一致, 因为step也可以是负数
  3. step可以省略, 默认为1
  4. end值也被循环一次, 所以逻辑不等于C的for(i=start; i!=end; i+=step)
  5. 循环过程中不要改变控制变量的值, 否则结果是不可预知的

break语句可以用来退出循环,但必须是语句块的最后一句.

函数