我相当确定在 Lua 中,您可以使用给定的元表__index
, __newindex
, 并__call
大致复制 Ruby 的method_missing
. 我有点:
function method_missing(selfs, func)
local meta = getmetatable(selfs)
local f
if meta then
f = meta.__index
else
meta = {}
f = rawget
end
meta.__index = function(self, name)
local v = f(self, name)
if v then
return v
end
local metahack = {
__call = function(self, ...)
return func(selfs, name, ...)
end
}
return setmetatable({}, metahack)
end
setmetatable(selfs, meta)
end
_G:method_missing(function(self, name, ...)
if name=="test_print" then
print("Oh my lord, it's method missing!", ...)
end
end)
test_print("I like me some method_missing abuse!")
print(this_should_be_nil)
我的问题是:虽然语法相似,我当然可以使用它来复制功能,但它引入了一个破坏性错误。您在应用 a 的表的上下文中使用的每一个变量method_missing
都永远不会为零,因为我必须返回一个可以调用的对象,以便pass the buck
从索引函数到实际调用的潜在调用。
即如上所述定义全局method_missing后,尝试调用未定义的方法'test_print'按预期运行,但索引时test_print的值是非nil,其他没有响应的方法/变量,如this_should_be_nil
非nil .
那么有没有可能避免这个陷阱呢?或者在不修改语言源本身的情况下可以不弯曲语法来支持这种修改吗?我想困难出现在 Ruby 中,索引和调用是相似的,而在 Lua 中它们是不同的。