Lua语法基础

  • 函数是第一类值(和其他变量相同),意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值
  • 逻辑运算符and和or的运算结果不是true和false,而是和它的两个操作数相关

    a and b     -- 如果a为false,则返回a,否则返回b
    a or b      -- 如果a为true,则返回a,否则返回b
    
  • 三元运算符 a and b or c
  • 连接运算符 .. 数字使用连接运算符会转换为字符串
  • 优先级

    1. not - (unary)
      • /
    2. + -
    3. ..
    4. < > <= >= ~= ==
    5. and
    6. 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 ‘%’]]

糖果

糖果
LUA教程

Lapis框架的常用处理方法

Lapis框架的常用处理方法 Continue reading

MoonScript实现选择排序

Published on February 26, 2017

MoonScript与Redis客户端

Published on January 19, 2017