【问题标题】:Lua metamethods not being called未调用 Lua 元方法
【发布时间】:2011-03-08 12:27:10
【问题描述】:

我对 Lua 有点陌生(还没有真正做太多事情),我正试图将我的注意力集中在元表上。我以前让他们工作,但现在(几个月后)我遇到了一些非常奇怪的事情。

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

__mt = {}

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

test = {}
test.x = 5

setmetatable(test, __mt)

print(test.x)

就我个人而言,我希望它打印“In __index”(来自元方法),然后是 99。但是,每当我运行它时,我都会得到 5。我所做的任何事情都无法让索引元方法运行。它就像我使用 rawget() 一样。

奇怪的是,添加

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

会做正确的事。元表在那里,__index() 是正确的,只是没有被调用。

这是一个错误还是我只是在做一些愚蠢的事情?我说不清楚。

【问题讨论】:

    标签: lua


    【解决方案1】:

    元方法(在旧术语中也称为 fallback)称为 __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
    

    【讨论】:

    • 啊,所以我在做一些愚蠢的事情。以前我在空表上使用自定义索引方法。有没有办法返回存储数据的函数(例如 2x 存储的任何内容)?
    • 您将不得不使用隐藏表,就像他在那里的表一样,并覆盖 __newindex 以指向隐藏表。这样,您的事件就可以一直触发。我经常使用这种技术。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多