• lua将除了false, nil之外的其他值都在条件判断中视为true, 包括字符串和0
    • 关键字大小写敏感
    • and or not
    • 命令行执行dofile(“xx.lua”) 会执行lua脚本
    • 字符串是不可变值,操作字符串会创建一个新字符串
    • print(#a)获取字符串a长度
    • "axb" .. "zxy" ..用来链接字符串
    • 多行字符串用[[ ]]包裹,其中也可以加上等量的等号来消除一些奇异比如 [==[ ]==]
    • 表table, 唯一的数据结构,package也是基于表上构建的,math.sin实际的意思是从表math中找key为sin的数据
    • 创建表a={}; a["xx"]=1
      • a={x =10, y=20}
      • a={x=1, {x=2, y=3}, {x=9, y=10}}既有kv 又有list, list用index索引 1 2 3…
      • a={["+"]=1, ["xx"]="yy"}更加标准的写法
      • a={1,2,3, nil, nil}; print(#a)== 3, nil元素都不算元素
      • a={1,2,3, nil, 4}; print(#a)== 5, nil元素都不算元素, 这里有空洞, 空洞后面还有数字所以算5
    • pairs遍历,这里key是无序输出的,而且每次可能不一样 ``` t = {10, print, x =12, k=”hi”} for k,v in pairs(t) do print(k,v) end

    结果 1 10 2 function: 0x107177067 k hi x 12

    1. - ipairs遍历是有序的,每次一样
    2. - 还有一种

    t = {10, print, x =12, k=”hi”} for k=1, #t do print(k, t[k]) end

    1. - 安全访问`zip = ((x or {}).director or {}).zip`
    2. - 当函数只有一个参数时 这两种是等价的 `dofile 'xx.lua' dofile("xx.lua")`
    3. - 可变长度参数函数`function add (...)`然后用ipairs{...}遍历参数
    4. - `string.format`, %q类似于go的%v
    5. - 变量默认为全局变量,局部变量要用local声明
    6. - do - end 视为一个scope
    7. - strict.lua模块会对没有声明而使用的全局变量进行检查
    8. - 循环
    9. - for do end
    10. - while do end
    11. - repeat until
    12. - `::tag::`是作为goto的位置标签
    13. - 函数可以存在table 这个也是构成module的主要方式
    14. - 错误处理
    15. - pcall接受一个函数,如果函数执行出现了异常pcall返回消息
    16. - xpcall可以把完整的栈信息打出阿里
    17. - error函数会抛出一个异常
    18. - metatable可以给一个table设置一个metatable,其可以用作重写一些操作符,比如+ - * / 构造只读表等
    19. - 面向对象

    Account = {b = 0}; function Account:withdraw(v) self.b = self.b - v end 等同于 function Account.withdraw(self, v) self.b = self.b - v end ```