- 1, Chunks
- 交互模式下的每一行都是可以算做一个块
- dofile加载的文件算做一个块
- -l加载的算是一个块
- 2, lua -i -e "print(math.sin(12))" -la -lb
- -i 进入交互模式
- -e 传入命令
- -l 加载文件块(lua会调用require)
- 3, lua =e "sin=math.sin" script a b
- arg[-3] = "lua"
- arg[-2] = "-e"
- arg[-1] = "sin=math.sin"
- arg[0] = "script"
- arg[1] = "a"
- arg[2] = "b"
- 4, Booleans
- 只有false和nil为假,其他值都为真
- 5, nil 也是一种类型
- 其他的类型有string,number,function,boolean,userdata,thread,table
- 6, 多行字符串可以用[[ ]], 括号中的字符无视转义字符, 除了字符里面包含了[[]]
- 如果要无视[[]]则应该要用, [=====[ ]=====]
- 7, 转义
- \a
- \b
- \f 换页
- \n
- \r
- \t
- \v
- \\
- \"
- \'
- \[
- \]
- \ddd 可以用数字表示字母
- 8, 关系运算符中的不等于符号 ~=
- if not x then .... end
- 9, 短路逻辑
- //假短路
- a and b --如果a为false, 则返回a, 否则返回b
- //真短路
- a or b --如果a为true, 则返回a, 否则返回 b
- and的优先级比or高
- (a and b) or c 等价于c中的 a? b: c
- xx = x or v 等价于if not x then x = v end
- 10, 表构造及简略
- -- 通过Page[1], Page[2]
- Page = {[1] = "green", [2] = "red"}
- --Page.x, Page.y或者Page["x"], Page["y"]
- Page = {["x"] = "green", ["y"] = "red"}
- --Page[1], Page[2]
- Page = {"green", "read"}
- --Page.x, Page.y或者Page["x"], Page["y"]
- Page = {x = "green", y = "red"}
- --Page.x, Page.y, Page[1],Page[2] 或者 Page["x"], Page["y"], Page[1], Page[2]
- Page = {x = "green", y = "red", "green", "red"}
- --Page.x, Page.y 或者Page["x"], Page["y"]
- green = 5; red = 8;
- Page = {x = green, y = red};
- 11, 语句简略
- x,yy = y,x 语句等价于交互x与y的值
- Lua的变量赋值策略:
- a. 变量个数 > 值的个数 按变量个数补足nil
- b. 变量个数 < 值的个数 多余的值会被忽略
- 12, 语句块简略
- while 条件 do 语句 end
- if 条件 then 语句 else 语句 end
- do 语句 end
- 详细=
- 条件:
- if conditions then
- then-part
- end;
- if conditions then
- then-part
- else
- else-part
- end;
- if conditions then
- then-part
- elseif conditions then
- elseif-part
- else
- else-part
- end;
- 循环:
- while condition do
- statements;
- end;
- repeat
- statements
- until conditons;
- --表达式只会计算一次,并且是在循环开始前
- --循环开始后不要改变循环变量
- for var=exp1,exp2,exp3 do --exp1->exp2 以exp3为step, 默认exp3为1
- loop-part
- end
- 流程控制:
- break和return语句, 只有块末尾或者是end前才能使用
- 13, 迭代器
- 例1:
- page = {"1", "2", "3", "4", "5"}
- function _fx(t, i)
- local n = table.getn(t)
- if tonumber(i) < n then
- ii = i + 1
- return t[i]
- else
- return nil
- end
- end
- for i in _fx, page, 0 do
- print(i)
- end
- 例2:
- page = {"1", "2", "3", "4", "5"}
- function _f(t, i)
- local n = table.getn(t);
- return function ()
- if i < n then
- ii = i + 1
- return page[i]
- else
- return nil;
- end
- end
- end
- for i in _f(page, 0) do
- print(i)
- end
- 1,初始化,计算in后面表达式的值,表达式应该返回范性for需要的3个值:
- 迭代函数、状态常量、控制变量;与多值赋值一样,如果表达式返回的结果个数不足三个
- 自动用nil补足,多出的部分会被忽略
- 2, 将状态常量与控制变量作为参数调用迭代函数
- 3, 将迭代函数返回的值赋予给变量列表(变量列表中,第1个变量为控制变量)
- 4, 如果返回的第1个值为nil循环结束,否则执行循环体
- 5, 跳到步骤2,再次调用迭代函数
- 无状态迭代器:
- a = {"one", "two", "three"}
- for i,v in ipairs(a) do
- print(i, v)
- end
- 实现常用迭代器:
- function iter(a, i)
- ii = i + 1
- local v = a[i]
- if v then
- return i,v
- end
- end
- function ipairs(a)
- return iter, a, 0
- end