数据结构
Lua 只提供一种数据结构:表(tables)。数组、字典以及更复杂的数据组织,都靠它。
1. 表(Tables)
表是 Lua 的核心数据结构,用于存储多个值。表可以用作数组、字典,甚至对象。
创建表
可以使用 {} 来创建一个新的表。
lua
local myTable = {}使用表作为数组
Lua 中的数组是通过整数索引的表来实现的。
lua
local fruits = {"apple", "banana", "cherry"}
print(fruits[1]) -- 输出 "apple"使用表作为字典
Lua 中的字典是通过字符串索引的表来实现的。
lua
local person = {
name = "John",
age = 30
}
print(person.name) -- 输出 "John"
print(person["age"]) -- 输出 30嵌套表
表可以嵌套使用,形成更复杂的数据结构。
lua
local matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
}
print(matrix[2][3]) -- 输出 62. 元表和元方法
元表(metatables)允许你改变表的行为,比如表的加法、索引等操作。元方法(metamethods)是定义在元表中的特殊方法。
设置元表
使用 setmetatable 函数为表设置元表。
lua
local t = {}
local mt = {
__index = function(table, key)
return "Default value"
end
}
setmetatable(t, mt)
print(t.someKey) -- 输出 "Default value"常见的元方法
__index: 当表的某个键不存在时调用__newindex: 当对表中不存在的键赋值时调用(对已存在的键赋值不会触发)__add,__sub,__mul: 支持运算符重载
示例:运算符重载
lua
local Vector = {}
Vector.__index = Vector
function Vector.new(x, y)
local self = setmetatable({}, Vector)
self.x = x
self.y = y
return self
end
function Vector.__add(v1, v2)
return Vector.new(v1.x + v2.x, v1.y + v2.y)
end
local v1 = Vector.new(1, 2)
local v2 = Vector.new(3, 4)
local v3 = v1 + v2
print(v3.x, v3.y) -- 输出 4 63. 字符串处理
Lua 提供了丰富的字符串处理功能,通过表的索引或库函数来实现。
字符串操作函数
string.len(s): 返回字符串s的长度string.upper(s): 返回字符串s的大写形式string.sub(s, start, end): 返回字符串s从start到end的子串
示例
lua
local s = "hello, world"
print(string.len(s)) -- 输出 12
print(string.upper(s)) -- 输出 "HELLO, WORLD"
print(string.sub(s, 1, 5)) -- 输出 "hello"4. 数组和字典的使用
Lua 表可以用作数组或字典,根据需求进行选择。
数组示例
lua
local numbers = {1, 2, 3, 4, 5}
for i = 1, #numbers do
print(numbers[i])
end字典示例
lua
local settings = {
volume = 5,
brightness = 8
}
for key, value in pairs(settings) do
print(key, value)
end结语
整数索引的表就是数组,字符串索引的表就是字典,改表的行为用元表,处理文本用 string 库。Lua 管数据的工具就这些。