返回首页

教程导航

返回首页

🏷️ 标签(1)

🗂️ 分类(1)

第 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

上一章:环境搭建 | 下一章:运算符与表达式