我相信在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)
我的问题是:虽然语法相似,我肯定可以使用它来复制功能,但这会引入一个破坏性错误。每个在应用
method_missing
到表上下文中使用的变量都不是nil,因为我必须返回一个可被调用对象,以便从索引函数传递到实际调用。例如,在上面定义全局
method_missing
后,尝试调用未定义方法“test_print”会按预期运行,但索引时test_print的值不是nil,而其他没有响应的方法/变量,如this_should_be_nil
也不是nil。因此,有可能避免这种陷阱吗?或者不能弯曲语法来支持这种修改而不修改语言源代码吗?我想困难出现在Ruby中,索引和调用是类比的,而在Lua中它们是不同的。
__index
,因此您的__index
函数的第一部分没有用处。 - dualed