返回

Lua 学习笔记

目录

Lua 速查表(Lua 5.5)

一、基础语法

1. 变量

  • 默认全局变量
  • local 定义局部变量
  • 支持多重赋值
  • 赋值本质是值拷贝(table/function 是引用)

易混淆点:

  • 未声明直接赋值就是全局变量
  • nil 会删除 table 键
  • 多重赋值是先整体计算右边,再统一赋值

示例:

1
2
3
4
local a = 10
b = 20
a, b = b, a
print(a, b)

2. 数据类型

  • nil
  • boolean
  • number(整数和浮点统一)
  • string
  • table
  • function
  • thread
  • userdata

易混淆点:

  • Lua 只有一种 number 类型
  • 只有 falsenil 为假

示例:

1
2
local x = 1
print(type(x))

二、运算符

1. 算术

  • + - * /
  • // 整除
  • % 取模
  • ^ 幂运算

易混淆点:

  • / 永远是浮点除
  • // 才是整除
1
2
print(5/2)
print(5//2)

2. 比较

  • ==
  • ~=
  • < > <= >=

易混淆点:

  • table 比较的是地址
  • 字符串可比较大小(字典序)
1
print({} == {})

3. 逻辑

  • and
  • or
  • not

特点:返回操作数本身,不是布尔值

易混淆点:

  • a or b 常用于默认值
  • 0 在 Lua 中为真
1
2
print(nil or 5)
print(0 and 10)

三、控制结构

1. if

  • 必须写 then
  • end 结束

易混淆点:

  • 不存在 else if,必须 elseif
1
2
3
4
local n = 5
if n > 3 then
    print("ok")
end

2. 循环

while

1
2
3
4
5
local i = 1
while i <= 3 do
    print(i)
    i = i + 1
end

repeat

  • 至少执行一次
1
2
3
4
5
local i = 1
repeat
    print(i)
    i = i + 1
until i > 3

for 数值循环

  • 起始,终止,步长

易混淆点:

  • 步长默认 1
  • 上限包含
1
2
3
for i = 1, 3 do
    print(i)
end

for 泛型循环

  • 常用 pairsipairs

易混淆点:

  • ipairs 遇到 nil 停止
  • pairs 无序
1
2
3
4
local t = {10,20}
for i,v in ipairs(t) do
    print(i,v)
end

四、函数

1. 基础定义

函数是一等公民

1
2
3
4
function add(a,b)
    return a+b
end
print(add(1,2))

2. 局部函数

1
2
3
4
local function f()
    return 1
end
print(f())

3. 可变参数

  • ...
  • select

易混淆点:

  • # {...} 可能受 nil 影响
1
2
3
4
function test(...)
    print(select("#",...))
end
test(1,2,3)

4. 多返回值

  • 默认只返回第一个
  • 放在表达式最后才展开

易混淆点:

  • 位置不同结果不同
1
2
3
4
5
6
function f()
    return 1,2
end

print(f())
print((f()))

五、Table

Lua 核心结构

1. 创建

1
2
3
local t = {}
local t2 = {1,2,3}
local t3 = {name="lua"}

2. 数组与字典混合

1
2
local t = {1,2,a=3}
print(t[1], t.a)

易混淆点:

  • 数组从 1 开始
  • 长度 # 不可靠(有洞时)

3. 删除元素

1
2
3
local t = {1,2,3}
t[2] = nil
print(#t)

4. table库

  • table.insert
  • table.remove
  • table.sort
  • table.concat
1
2
3
local t = {3,1,2}
table.sort(t)
print(table.concat(t,","))

六、字符串

不可变

常用函数

  • string.sub
  • string.find
  • string.match
  • string.gsub
  • string.format

易混淆点:

  • Lua 使用模式匹配,不是完整正则
  • . 在模式里代表任意字符
1
2
local s = "abc123"
print(string.match(s,"%d+"))

七、错误处理

error

1
error("fail")

pcall

  • 捕获错误
1
2
3
4
local ok,err = pcall(function()
    error("bad")
end)
print(ok,err)

易混淆点:

  • pcall 返回 true/false + 返回值

八、元表

Lua 面向对象和运算符重载核心

常见元方法

  • __index
  • __newindex
  • __add
  • __tostring
  • __call

__index 示例

1
2
3
4
5
6
7
8
local mt = {
    __index = function(t,k)
        return "default"
    end
}

local t = setmetatable({},mt)
print(t.a)

易混淆点:

  • __index 可是 table 或 function
  • 只在访问不存在键时触发

九、简单面向对象

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
local Person = {}
Person.__index = Person

function Person:new(name)
    local obj = setmetatable({},self)
    obj.name = name
    return obj
end

function Person:say()
    print(self.name)
end

local p = Person:new("Tom")
p:say()

易混淆点:

  • : 会自动传 self
  • . 不会传 self

十、协程

轻量级线程

常用函数

  • coroutine.create
  • coroutine.resume
  • coroutine.yield
  • coroutine.status
  • coroutine.wrap

示例:

1
2
3
4
5
6
7
local co = coroutine.create(function()
    coroutine.yield(1)
    return 2
end)

print(coroutine.resume(co))
print(coroutine.resume(co))

易混淆点:

  • resume 返回 是否成功 + 返回值
  • yield 只能在协程中调用

十一、模块

require

  • 自动缓存
  • 只加载一次
1
local m = require("mymodule")

易混淆点:

  • require 返回模块 return 的值
  • 模块本质就是返回 table

十二、重要语义总结

  • 变量默认全局
  • table 是引用类型
  • 函数是值
  • 数组从 1 开始
  • and/or 返回操作数
  • 只有 nil 和 false 为假
  • # 对非连续数组不可靠
  • 多返回值只有在最后位置展开
  • : 等价于 obj.method(obj, ...)

Licensed under CC BY-NC-SA 4.0