在没有键的情况下引用表是否可能返回特定值而不是对自身的引用?
假设我有下表:
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/