Menu
CoddyTech

__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。

这样就创建了一种备用机制,一个表可以为另一个表提供默认值。原表会保留自己的值,但缺少的键会自动从备用表中查找。

challenge icon

挑战

简单

编写一个函数 createCharacterWithDefaults,它接收 name 和 level,并返回一个包含默认属性值的角色表。

创建一个包含所提供名称和等级的角色表。使用带有 __index 的元表,为任何缺失的属性(health、mana、strength)提供默认值。

逻辑:

  • 创建一个默认值表,包含以下键:health = 100、mana = 50、strength = 10
  • 创建一个角色表,包含以下键:name(所提供的名称)和 level(所提供的等级)
  • 创建一个元表,其中的 __index 指向默认值表
  • 使用 setmetatable() 将元表附加到角色表
  • 返回角色表

参数:

  • name(字符串):角色的名称
  • level(数字):角色的等级

返回值:一个包含名称、等级以及可通过元表访问的默认属性的角色表(表)

亲手试试

function createCharacterWithDefaults(name, level)
    -- 在这里写代码
end
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Lua 在线编译器