syntax - 我可以为自己覆盖 Lua 表的返回值吗?

标签 syntax lua overriding lua-table meta-method

在没有键的情况下引用表是否可能返回特定值而不是对自身的引用?

假设我有下表:

local person = {
    name  = "Kapulani",
    level = 100,
    age   = 30,
}

在 Lua 中,我可以很容易地引用“person.name”、“person.level”或“person.age”并按预期获得值。但是,在某些情况下,我可能只想引用“person”,而不是获取“table:”,我想返回“person.name”的值。

换句话说,我希望 person.x(或 person[x])从表中返回适当的条目,但没有键的 person 返回 person.name(或 person["name"]).有没有我找不到的机制?

我在元表上没有成功,因为 __index 只适用于键不存在的情况。如果我把“人”放在一个单独的表中,我可以想出:

local true_person = {
    ... -- as above
}

local env_mt = {
    __index = function(t, k)
        if k == 'person' then
            return true_person
        end
    end
}

local env = setmetatable( {}, env_mt )

这让我可以使用 __index 来做一些特殊的处理,除了我无法通过 __index() 判断我是否正在收到对 env.person 的请求(我想在其中返回 true_person。 name) 或 env.person[key](我想将 true_person 作为表返回,以便可以适本地访问“key”)。

有什么想法吗?我可以采用不同的方法来解决这个问题,但希望我可以按照这些思路来解决这个问题。

最佳答案

当表被用作字符串时,您可以通过设置 __tostring 元表条目来执行此操作:

$ cat st.lua
local person = {
    name  = "Kapulani",
    level = 100,
    age   = 30,
}

print(person)
print(person.name)
print(person.age)

setmetatable(person, {__tostring = function(t) return t.name end})
print(person)

$ lua st.lua
lua st.lua
table: 0x1e8478e0
Kapulani
30
Kapulani

关于syntax - 我可以为自己覆盖 Lua 表的返回值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24813370/

相关文章:

C 语句 const 含义

syntax - 在模块声明中选择接口(interface)参数

perl - 为什么在没有粗逗号和严格的 `use` 行上允许使用前导连字符选项?

lua - 在 scintilla 控件中设置 lua 基本功能的高亮颜色

java - java如何在运行时解析隐藏方法

c# - 我们什么时候真正需要从重写方法中调用父类的重写方法?

html - 不能用 ! 覆盖内联样式重要属性(property)?

syntax - F# 中 Item 属性的类型

macos - “module ' socket.http ' not found:” --iMac上的Lua

c++ - 随着线程数的增加,Lua 会扼杀多线程性能(包括条形图)