Lua metamethods没有被调用

Tom*_*age 3 lua

我对Lua有点新手(还没有真正做到这一点)我正试着把我的思想包裹在metatables中.我曾经让他们工作过,但现在(经过几个月)我遇到了一些非常奇怪的事情.

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

__mt = {}

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

test = {}
test.x = 5

setmetatable(test, __mt)

print(test.x)
Run Code Online (Sandbox Code Playgroud)

就个人而言,我希望它打印"In __index"(来自metamethod),然后是99.然而,每当我运行它时,我得到5.我没有做任何事情都可以让索引元方法运行.它只是像我正在使用的行为rawget().

奇怪的是,添加

print(getmetatable(test).__index(test, "x"))
Run Code Online (Sandbox Code Playgroud)

会做正确的事.metatable在那里,__index()是正确的,它只是没有被调用.

这是一个错误还是我只是在做一些愚蠢的事情?我说不出来.

u0b*_*6ae 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
Run Code Online (Sandbox Code Playgroud)