Lua语法基础

2.6k 词
  • 函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值
  • 逻辑运算符and和or的运算结果不是true和false,而是和它的两个操作数相关
    a and b     -- 如果a为false,则返回a,否则返回b
    a or b      -- 如果a为true,则返回a,否则返回b
  • 三元运算符 a and b or c
  • 连接运算符 .. 数字使用连接运算符会转换为字符串
  • 优先级

    1. ^
    2. not - (unary)
    3. * /
    4. + -
    5. ..
    6. < > <= >= ~= ==
    7. and
    8. 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 '%']]