第 3 章 基本类型与变量
第 3 章 基本类型与变量
Lua 有八种基本类型:nil、boolean、number、string、function、userdata、thread 和 table。日常开发最常用的是前六种。
nil、boolean 与 number
nil
nil 表示“没有值”。未赋值的全局变量和表中不存在的键都会得到 nil:
local value
print(value == nil) -- true
local data = {}
print(data.missing) -- nil
boolean
只有 false 和 nil 被视为假,其他值都是真,包括 0 和空字符串:
local values = { false, nil, 0, "" }
for index = 1, 4 do
local value = values[index]
print(index, value and "truthy" or "falsy")
end
注意,表中的 nil 值不会保存,因此上面实际只有索引 1、3、4。
number
Lua 5.4 包含整数和浮点数字类型:
local intValue = 1_000_000
local floatValue = 3.14
local exponent = 1e3
local hexValue = 0xFF
print(math.type(intValue)) -- integer
print(math.type(floatValue)) -- float
print(exponent) -- 1000.0
print(hexValue) -- 255
数字可以包含下划线以提高可读性。整数溢出在 Lua 中会按补码语义回绕,涉及金额或大整数时应明确选择表示方式。
字符串与字符串字面量
字符串是不可变字节序列,用单引号、双引号或长括号表示:
local name = "Lua"
local message = 'Hello, ' .. name
local multiline = [[
第一行
第二行
]]
字符串长度使用 #:
print(#"Lua") -- 3
print(("Lua"):upper()) -- LUA
Lua 字符串按字节计数。处理中文等 UTF-8 文本时,字符数应使用 utf8.len:
local text = "你好,Lua"
print(#text) -- 字节数
print(utf8.len(text)) -- 字符数
局部变量与全局变量
使用 local 声明局部变量。局部变量作用域从声明处开始,到当前块结束:
local outer = "outer"
do
local inner = "inner"
print(outer, inner)
end
print(outer)
-- print(inner) -- 错误:作用域外不可见
不加 local 的赋值会写入全局表 _G:
counter = 0
counter = counter + 1
print(_G.counter)
工程代码应优先使用局部变量。全局变量容易造成隐式依赖和命名冲突,尤其是被多个模块共享时。
多变量赋值
Lua 支持同时赋值多个变量:
local a, b = 1, 2
a, b = b, a
print(a, b) -- 2 1
值不足时补 nil,值过多时忽略:
local x, y, z = 1, 2
print(x, y, z) -- 1 2 nil
右侧表达式先全部求值,再赋值。这个规则让交换变量不需要临时变量。
type 与类型判断
type 返回值类型名称,math.type 用于区分整数和浮点数:
local samples = {
true,
1,
1.5,
"text",
print,
{},
coroutine.create(function() end)
}
for _, value in ipairs(samples) do
print(type(value))
end
local emptyValue = nil
print(type(emptyValue)) -- nil
需要判断整数时可组合使用:
local function isInteger(value)
return type(value) == "number" and math.type(value) == "integer"
end
print(isInteger(10)) -- true
print(isInteger(10.0)) -- false