__index
Lua では、特定のメタテーブルの、__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 ではありません。pass the buck
つまり、上記のようにグローバルな method_missing を定義した後、未定義のメソッド 'test_print' を呼び出そうとすると、期待どおりに実行されますが、インデックスが作成されたときの test_print の値は非 nil であり、応答されない他のメソッド/変数this_should_be_nil
は非 nil です。 .
では、この落とし穴を回避することは可能でしょうか? または、言語ソース自体を変更せずに、この変更をサポートするために構文を曲げることはできませんか? Ruby ではインデックス作成と呼び出しが類似しているのに対し、Lua ではそれらが異なるという点で困難が生じると思います。