Lua 数据类型概览
探索 nil、布尔值、数字、字符串、表、函数与 userdata 类型
Lua 数据类型概览 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
欢迎学习 Lua
Lua 是一种轻量、快速且可嵌入的脚本语言,广泛用于游戏引擎、Web 服务器和嵌入式系统。在编写真正的程序之前,您需要了解 Lua 如何表示数据。
Lua 有 8 种基本类型:nil、boolean、number、string、table、function、userdata 和 thread。Lua 中的每个值都恰好属于其中一种类型。
-- Check the type of any value with type()
print(type(42)) -- number
print(type("hello")) -- string
print(type(true)) -- boolean
print(type(nil)) -- nilnil:没有值
nil 是 Lua 表示什么都没有或没有值的方式。它是该类型唯一的值。从未被赋值的变量会自动保存 nil。
将 nil 赋给全局变量实际上会删除该变量。在表中,将某个键设置为 nil 会完全移除对应的条目。
-- Unassigned variables are nil
print(x) -- nil
x = 10
print(x) -- 10
x = nil
print(x) -- nil (variable is gone)boolean:true 和 false
boolean 类型恰好有两个值:true 和 false。Lua 的真值规则简单却很重要:只有 nil 和 false 会被视为假值。其他所有值都是真值,包括数字 0 和空字符串 ""。
这与许多语言不同,在那些语言中,0 或 "" 会被视为 false。
-- Lua truthiness examples
if 0 then print("0 is truthy!") end -- prints!
if "" then print("empty str is truthy!") end -- prints!
if nil then print("nil") else print("nil is falsy") end
if false then print("false") else print("false is falsy") endnumber:整数和浮点数
Lua 5.3+ 的 number 有两种子类型:整数和浮点数。整数是精确的 64 位值;浮点数采用 IEEE 754 双精度格式。在 Lua 5.1/5.2 中,所有数字都是双精度数。
math.type() 函数可以区分这两种子类型。使用 / 除法始终返回浮点数;当两个操作数都是整数时,//(向下取整除法)返回整数。
print(type(10)) -- number
print(type(10.5)) -- number
print(math.type(10)) -- integer
print(math.type(10.5))-- float
print(10 / 3) -- 3.3333...
print(10 // 3) -- 3 (floor division)string:Lua 中的文本
Lua 中的字符串是不可变的字节序列。您可以使用单引号、双引号,或使用多行字符串的长括号 [[...]] 来界定字符串。长括号字符串会忽略第一个换行符,并按原样保留其他所有内容。
Lua 字符串会被驻留,因此相同的字符串会共享内存。长度运算符 # 返回字节数。
local s1 = 'single quotes'
local s2 = "double quotes"
local s3 = [[multi-line
long string]]
print(#s1) -- 13
print(type(s1)) -- string
print(s1 .. " works") -- concatenation with ..table:通用容器
table 类型是 Lua 唯一的复合数据结构,但它强大到足以实现数组、字典、对象、集合等结构。表是关联数组:它将键映射到值,其中键可以是任何非 nil、非 NaN 的值。
表使用花括号 {} 创建。数组风格的表使用从 1 开始的整数键。
-- Array style
local fruits = {"apple", "banana", "cherry"}
print(fruits[1]) -- apple (1-indexed!)
-- Dictionary style
local person = {name = "Alice", age = 30}
print(person.name) -- Alice
print(person["age"]) -- 30function:一等值
Lua 中的函数是 function 类型的一等值。它们可以存储在变量中、作为参数传入,也可以由其他函数返回。这使 Lua 天然适合函数式编程模式。
您可以使用 function 关键字定义函数,也可以将匿名函数赋给变量。这两种形式是等价的。
-- Two equivalent ways to define a function
function greet(name)
return "Hello, " .. name
end
local greet2 = function(name)
return "Hello, " .. name
end
print(type(greet)) -- function
print(greet("Lua")) -- Hello, Luauserdata 和 thread
userdata 表示由宿主应用程序管理的任意 C 数据。您无法在纯 Lua 中创建 userdata——它来自 C 扩展或游戏引擎等嵌入环境。它允许 C 代码向 Lua 脚本公开对象。
thread 表示协程——拥有各自栈的独立执行线程。我们将在专门的课程中探讨协程。现在您只需知道,coroutine.create() 会返回 thread 类型的值。
-- thread type via coroutine
local co = coroutine.create(function()
print("coroutine body")
end)
print(type(co)) -- thread
-- userdata comes from C, not creatable in pure Lua
-- type(io.stdin) == "file" is a userdata variant使用 type() 检查值
内置的 type() 函数始终返回一个字符串,用于表示其参数的类型。这对于防御式编程和调试很有用。您可以直接将结果与表示类型名称的字符串进行比较。
请注意,type(nil) 返回字符串 "nil",而不是值 nil 本身。这样,您就可以安全地检查变量是否保存 nil,而不会产生错误。
local values = {42, "hi", true, nil, {}, function() end}
-- Note: nil in table stops ipairs early
for i = 1, 3 do
print(i, type(values[i]))
end
-- 1 number
-- 2 string
-- 3 boolean与其他语言的类型差异
如果您使用过 JavaScript、Python 或 Java,那么 Lua 的一些类型规则可能会让您感到意外。type() 不会显示单独的整数类型——整数和浮点数都会返回 "number"。数组没有自己的类型——它们只是表。Lua 中不存在类——对象是带有元表的表。
了解这些差异有助于避免在不同语言之间切换时出现常见错误。
-- No separate array type
local arr = {1, 2, 3}
print(type(arr)) -- table (not array!)
-- No separate integer type visible
print(type(1)) -- number
print(type(1.0)) -- number
-- math.type distinguishes
print(math.type(1)) -- integer
print(math.type(1.0)) -- float快速检查
在 Lua 中,type(0) 会返回什么?
回顾:Lua 数据类型概览
您已经学习了 Lua 的全部 8 种类型:
- nil — 没有值;假值
- boolean — true/false;只有 nil 和 false 是假值
- number — 整数或浮点数;使用 math.type() 进行区分
- string — 不可变的字节序列;使用 .. 进行拼接
- table — 用于数组和字典的通用容器
- function — 可存储在变量中的一等值
- userdata — 暴露给 Lua 的 C 数据
- thread — 协程句柄
下一步:声明变量——全局作用域与局部作用域。
常见问题解答
「Lua 数据类型概览」课时是免费的吗?
是的 — 「Lua 数据类型概览」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「Lua 数据类型概览」这节课中我会学到什么?
探索 nil、布尔值、数字、字符串、表、函数与 userdata 类型 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「Lua 数据类型概览」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Lua 数据类型概览
- 在 Lua 中声明变量
- 算术运算符和关系运算符
- 类型强制转换和显式转换