独自のクラスシステムを実装しましたが、問題が発生してい__tostring
ます。他のメタメソッドでも同様の問題が発生する可能性があると思いますが、試していません。
(簡単な迂回:各クラスには、__classDict
すべてのメソッドを保持する属性があります。これは、クラスインスタンスとして使用されます__index
。同時に、__ classDict__index
はスーパークラス__classDict
であるため、スーパークラスのメソッドは自動的に検索されます。)
すべてのインスタンスで「デフォルトのtostring」動作が必要でした。しかし、それは機能しませんでした。「tostring」動作は、サブクラスを正しく「伝播」しません。
私は自分の問題を例示するこのテストを行いました:
mt1 = {__tostring=function(x) return x.name or "no name" end }
mt2 = {}
setmetatable(mt2, {__index=mt1})
x = {name='x'}
y = {name='y'}
setmetatable(x, mt1)
setmetatable(y, mt2)
print(x) -- prints "x"
print(mt2.__tostring(y)) -- prints "y"
print(y) -- prints "table: 0x9e84c18" !!
その最後の行に「y」を印刷してもらいたいです。
Luaの「to_String」の動作は、同等のものを使用している必要があります
rawget(instance.class.__classDict, '__tostring')
と同等のことをする代わりに
instance.class.__classDict.__tostring
すべてのメタメソッドで同じことが起こると思います。rawget
-同等の操作が使用されます。
私ができることの1つは、サブクラス化を行うときにすべてのメタメソッドをコピーすることだと思います(上記の例と同等のものが実行されますmt2.__tostring = mt1.__tostring
)が、それは一種のエレガントではありません。
誰かがこの種の問題と戦ったことがありますか?あなたのソリューションはどこにありますか?