我是Lua的新手(还没有真正用它做过多)而且我正试图把我的思想包裹在metatables中。我曾经让他们工作过,但现在(经过几个月)我遇到了一些非常奇怪的东西。
此脚本在运行时应该打印什么?
__mt = {}
__mt.__index = function(table, key)
print("In __index")
return 99
end
test = {}
test.x = 5
setmetatable(test, __mt)
print(test.x)
就个人而言,我希望它打印“In __index”(来自metamethod),然后是99.但是,每当我运行它时,我得到5.我所做的任何事情都无法运行索引元方法。它就像我正在使用rawget()
一样。
奇怪的是,添加
print(getmetatable(test).__index(test, "x"))
会做正确的事。 metatable在那里,__index()
是正确的,它只是没有被调用。
这是一个错误还是我只是在做一些愚蠢的事情?我不知道。
答案 0 :(得分:8)
只有在表格中不存在密钥__index
时,才会调用名为x
的元语法(在旧术语中也称为后备) ,当您访问t.x
时。请改为print(t.y)
!
补充:是的,使用代理表。
function doubletable(T)
local store = T or {}
local mt = {}
mt.__index = function (t, k) return store[k] and 2*store[k] end
mt.__newindex = store
return setmetatable({}, mt)
end
t = doubletable({a=1, b=3})
t.c = 7
print(t.a, t.b, t.c)
-- output: 2 6 14