Ich bin mir ziemlich sicher, dass Sie in Lua die __index
, __newindex
und __call
einer gegebenen Metatabelle verwenden können, um Rubys method_missing
grob zu replizieren. Und ich habe etwas:Ist es möglich, Rubys method_missing in Lua zu replizieren?
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)
Mein Problem ist folgendes: Während die Syntax ähnlich ist, und ich kann es auf jeden Fall die Funktionalität zu replizieren verwenden, es führt einen Bruchfehler. Jede einzelne Variable, die Sie im Kontext der Tabelle verwenden, in der Sie eine method_missing
anwenden, ist nie null, da ich ein Objekt, das aufgerufen werden kann, um pass the buck
des potenziellen Aufrufs von der Indexfunktion zu einem tatsächlichen Aufruf zurückgeben kann.
ie Nach dem Definieren eines globalen method_missing wie oben wird der Versuch, die undefinierte Methode 'test_print' aufzurufen, wie erwartet ausgeführt, aber der Wert von test_print bei der Indizierung ist nicht nil und andere Methoden/Variablen, auf die nicht geantwortet wird this_should_be_nil
sind nicht-Null.
So ist es möglich, diese Falle zu vermeiden? Oder kann die Syntax nicht so geformt werden, dass sie diese Modifikation unterstützt, ohne die Sprachquelle selbst zu verändern? Ich stelle mir vor, die Schwierigkeit besteht darin, dass in Ruby Indexierung und Aufruf analog sind, während sie in Lua verschieden sind.
Gibt es auch einen Anwendungsfall oder eine Klasse von Anwendungsfällen, die Sie normalerweise mit dieser Technik lösen? Sie sollten es wahrscheinlich in Ihrer Frage erwähnen, um das [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) zu vermeiden. Vielleicht kann Lua einen anderen Ansatz dafür bieten. – greatwolf
Da '__index' nicht aufgerufen wird, wenn der Wert in einer Tabelle existiert, hat der erste Teil der' __index' -Funktion keine Verwendung. – dualed