例にこれらの間__index
メタメソッドの振る舞いに差がある理由は、私が悩みの理解を持っている:Luaのメタテーブル矛盾
lua: l.lua:8: attempt to call method 'speak' (a nil value)
:
A = { __index = A }
function A:speak()
print("I'm an A")
end
An_A = setmetatable({},A)
An_A:speak()
は、次のようなエラーが発生します
B = { __index = function(t,key) return B[key] end }
function B:speak()
print("I'm an B")
end
An_B = setmetatable({},B)
An_B:speak()
期待どおりに実行され、I'm an B
を出力します。これは私がPILのthisセクションを読んでそうであった理由を理解しようとして
。このの私の理解では、「A」を含むスニペットでは、(上記の引用のboldened segmenetあたりとして)アクセスは、テーブルA
で行うことになり__index = A
ことです
The use of the __index metamethod for inheritance is so common that Lua provides a shortcut. Despite the name, the __index metamethod does not need to be a function: It can be a table, instead. When it is a function, Lua calls it with the table and the absent key as its arguments. When it is a table, Lua redoes the access in that table.
:それはと述べています。これが当てはまる場合、なぜキー"speak"
に関連する機能が見つからないのかわかりません。これを修正しようとする試みで、key
に関連付けられた値を返すB
スニペットに関数アプローチを実装することにしました。それはB
になりました。確かに__index = A
および(B
に適合)__index = function(t,key) return A[key] end
は同じ効果を有する。
いずれかの明確化は非常に認められる。
は偉大な説明をありがとう、起こるだろう、私はそのような= F 'として何か他の言語のようになると想定していた私には発生しませんでしたλn:f(n) 'が有効である。歓声: – HennyH
@HennyH: 'f = function(n)return f(n)end'は同じ理由からluaでは問題ありません。同等の失敗したPythonは 'd = {" __index ":d}'ですが、Pythonは 'NameError'を返します。 – Eric
@Eric再帰関数は同じパターンに従うとします。 – HennyH