Lua元方法未被调用

我对Lua还比较陌生(并没有做过太多),我正在努力理解元表。我以前用过它们,但是现在(数月后)我遇到了一些非常奇怪的事情。

运行此脚本时,应该打印什么?

__mt = {}

__mt.__index = function(table, key)
    print("In __index")
    return 99
end

test = {}
test.x = 5

setmetatable(test, __mt)

print(test.x)

就我个人来说,我希望它打印“在 __index 中”(从元方法中),然后是99。然而,无论我怎么运行它,都会得到5。我无法让索引元方法运行。它就像我在使用 rawget()一样。

有趣的是,添加

print(getmetatable(test).__index(test, "x"))

会得到正确的结果。元表在那里,__index()也是正确的,它只是没有被调用。

这是一个错误还是我做了什么愚蠢的事情?我分不清楚。

原文链接 https://stackoverflow.com/questions/3122122

点赞
stackoverflow用户137317
stackoverflow用户137317

元方法(在旧术语中也称为_回退_)称为__index,只有在访问t.x时如果键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)
-- 输出:2    6   14
2010-06-25 23:51:50