Lua语法基础
- 函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值
- 逻辑运算符and和or的运算结果不是true和false,而是和它的两个操作数相关
a and b -- 如果a为false,则返回a,否则返回b
a or b -- 如果a为true,则返回a,否则返回b
- 三元运算符
a and b or c
- 连接运算符 .. 数字使用连接运算符会转换为字符串
优先级
- ^
- not - (unary)
- * /
- + -
- ..
- < > <= >= ~= ==
- and
- or
表
- 可以使用{}直接构造
- 用[expression]显示的表示将被初始化的索引
控制结构语句
- if语句
- while语句
- repeat until语句
- for语句:ipairs迭代数组元素。不能返回nil,只能返回数字0,如果遇到nil则退出。从1开始,它只能遍历到表中出现的第一个;pairs迭代table元素,遍历所有的键值对。并且除了迭代器本身和遍历表本身还可以返回nil
if condtion1 then
elseif condtion2 then
end
while condition3 do
end
repeat
until condition4
for var = exp1, exp2, exp3 do
end
- 函数
- 多返回值:
- 当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。
- 其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)
- 函数调用作为函数参数被调用和在表构造函数中初始化时,和多值赋值相同。
- 可以使用圆括号强制使用返回一个值
- 可变参数:使用三点(...)表示函数有可变的参数。可变的参数放在arg的表中,arg中还有一个域n表示参数的个数。
- 高级函数:以其他函数作为参数的函数。
- 多返回值:
- 闭包
- 闭包是一个函数以及它的upvalues。高级函数内的匿名函数使用高级函数的局部变量。
- 尾调用:当函数的最后一个动作时调用另外一个函数。
- 一个典型的闭包的结构包含两个函数:一个是闭包自己;另一个是工厂(创建闭包的函数)。
- 迭代器
- 范型for的执行过程:1.初始化,计算in后面表达式的值,表达式应该返回范性for需要的三个值:迭代函数、状态常量、控制变量;2.将状态常量和控制变量作为参数调用迭代函数;3.将迭代函数返回的值赋给变量列表;4.如果返回的第一个值为nil循环结束,否则执行循环体;5.回到第二步再次调用迭代函数。
- String函数库
- string.len(s): 返回字符串s的长度
- string.rep(s,n): 返回重复n次字符串s的串
- string.lower(s), string.upper(s): 大小写转换
- string.sub(s,i,j): 截取字符串s的从第i 个字符到第j 个字符之间的串。string.sub(s, 1, j)返回字符串s的长度为j的前缀;string.sub(s, j, -1)返回从第j个字符开始的后缀。
- string.char(...): 获取0个或多个整数,将每一个数字转换成字符,然后返回一个所有这些字符连接起来的字符串
- string.byte(s, i): 将字符串s的第i个字符的转换成整数
- string.format(): 字符串格式化,和C的printf类似。
- stirng.find(s, word): 在目标串内搜索匹配指定的模式的串。函数如果找到匹配的串返回他的位置,否则返回nil。第三个参数是可选的:标示目标串中搜索的起始位置,支持模式匹配。
- string.gsub(s, 匹配模式, 替换字符(函数))
- string.gfind(s, 匹配模式)
- Lua面向对象编程
- 元表(metatable): 多个table可以定义同一个元表,表示共性操作。也可以定义自己为元表,表示私有操作。
- metamethod:_add, _mul, _sub, _div, _unm(取负), _pow, _concat, _eq, _lt, _le
- Lua选择metamethod的原则:如果第一个参数存在带有add域的metatable,Lua使用它作为metamethod,和第二个参数无关;否则第二个参数存在带有add域的metatable,Lua使用它作为metamethod 否则报错。
- 原型(prototype): __index通过原型访问表中缺少的域
- 包(package): 公有函数和私有函数的访问方式不一致(公有函数要加上前缀包名)
- 使用全局表:setfenv(1, p)
- 私有性:使用闭包来实现
- Lua中table使用=号直接赋值是赋值引用(浅拷贝),如要深拷贝需要定义深拷贝函数。
- Lua 时间库
os.time() -- 返回当前系统的日历时间
os.date() -- 返回本地化的时间字符串,这里是"11/28/08 17:23:37"
os.date("%x", os.time()) -- 返回自定义格式化时间字符串(完整的格式化参数),这里是"11/28/08"
os.clock() -- 返回执行该程序CPU花去的时钟秒数,这里是1156.726
--[[%a abbreviated weekday name (e.g., Wed)
%A full weekday name (e.g., Wednesday)
%b abbreviated month name (e.g., Sep)
%B full month name (e.g., September)
%c date and time (e.g., 09/16/98 23:48:10)
%d day of the month (16) [01-31]
%H hour, using a 24-hour clock (23) [00-23]
%I hour, using a 12-hour clock (11) [01-12]
%M minute (48) [00-59]
%m month (09) [01-12]
%p either "am" or "pm" (pm)
%S second (10) [00-61]
%w weekday (3) [0-6 = Sunday-Saturday]
%x date (e.g., 09/16/98)
%X time (e.g., 23:48:10)
%Y full year (1998)
%y two-digit year (98) [00-99]
%% the character '%']]