【发布时间】:2013-11-15 13:44:44
【问题描述】:
我相当确定在 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 的表的上下文中使用的每个变量都不会为零,因为我必须返回一个可以调用的对象,以便将索引函数的潜在调用pass the buck实际通话。
即如上所述定义全局method_missing后,尝试调用未定义的方法'test_print'按预期运行,但索引时test_print的值非nil,其他没有响应的方法/变量,如this_should_be_nil是非-无。
那么有可能避免这个陷阱吗?或者在不修改语言源本身的情况下可以不弯曲语法来支持这种修改吗?我想困难在于 Ruby 中的索引和调用是相似的,而在 Lua 中它们是不同的。
【问题讨论】:
-
是否还有一个用例或一类用例您通常使用这种技术来解决?您可能应该在问题中提及它以避免XY problem。也许 lua 可以为它提供不同的方法。
-
因为
__index如果值存在于表中则不会被调用,所以__index函数的第一部分没有用。
标签: syntax lua metaprogramming method-missing