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()进行显式转换
..
是字符串连接符, 相当于某些语言中的+
警告
- 在lua里使用条件判断时, 除了false和nil为假, 其他条件都为真, 所以数字0和空字符串也为真.
- string里可以有0, 且是可读的, 要修改必须新建一个变量
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可以一次性给多个变量同时赋值, 变量列表和值列表的各元素用逗号隔开:
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
警告
- for后面的表达式只会在循环开始前被计算1次
- 上面的C等价语句其实不完全一致, 因为step也可以是负数
- step可以省略, 默认为1
- end值也被循环一次, 所以逻辑不等于C的for(i=start; i!=end; i+=step)
- 循环过程中不要改变控制变量的值, 否则结果是不可预知的
break语句可以用来退出循环,但必须是语句块的最后一句.