__index 元方法
本课属于 Coddy Lua 学习旅程的“逻辑与流程”单元。第 18 课,共 54 课。
现在你已经知道如何将元表附加到表上,是时候了解最重要的元方法:__index。当你尝试访问表中不存在的键时,这个元方法会决定接下来发生什么。
通常,当你查找表中不存在的键时,Lua 会返回 nil。但是,如果表的元表中有 __index 字段,Lua 就会改为检查该字段。如果 __index 指向另一个表,Lua 就会在那里查找这个键:
local defaults = {
health = 100,
speed = 10
}
local player = {name = "Alice"}
local meta = {__index = defaults}
setmetatable(player, meta)
print(player.name) -- 输出:Alice
print(player.health) -- 输出:100在这个示例中,player 只有一个 name 键。访问 player.health 时,Lua 在 player 中找不到它,于是会检查元表的 __index 字段。由于 __index 指向 defaults 表,Lua 会在其中查找,并找到 health = 100。
这样就创建了一种备用机制,一个表可以为另一个表提供默认值。原表会保留自己的值,但缺少的键会自动从备用表中查找。
挑战
简单编写一个函数 createCharacterWithDefaults,它接收 name 和 level,并返回一个包含默认属性值的角色表。
创建一个包含所提供名称和等级的角色表。使用带有 __index 的元表,为任何缺失的属性(health、mana、strength)提供默认值。
逻辑:
- 创建一个默认值表,包含以下键:
health = 100、mana = 50、strength = 10 - 创建一个角色表,包含以下键:
name(所提供的名称)和level(所提供的等级) - 创建一个元表,其中的
__index指向默认值表 - 使用
setmetatable()将元表附加到角色表 - 返回角色表
参数:
name(字符串):角色的名称level(数字):角色的等级
返回值:一个包含名称、等级以及可通过元表访问的默认属性的角色表(表)
亲手试试
function createCharacterWithDefaults(name, level)
-- 在这里写代码
end
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Lua 在线编译器