Lua のメタテーブルが OOP でどのように機能するかを学んでいますが、lua-users wiki のオブジェクト指向チュートリアルから読んだコードについて混乱しています。誰かが次の質問を説明するのを手伝ってくれませんか? ありがとう。
質問 1: ウィキの説明: ここでは、値が関数のように呼び出されるとトリガーされる __call メタメソッドを持つクラス テーブルにメタテーブルを追加します。クラスのコンストラクターを呼び出すようにするため、インスタンスを作成するときに .new は必要ありません。
(1)コンストラクターが呼び出されるように、例で __call はどのように呼び出されますか?
(2)「cls」は「MyClass」のことですか?
setmetatable(MyClass, {
__call = function (cls, ...)
return cls.new(...)
end,
})
質問 2: 次のコードの {} は何を参照していますか?
function MyClass.new(init)
local self = setmetatable({}, MyClass)
self.value = init
return self
end
**完全なコードは次のとおりです。
local MyClass = {}
MyClass.__index = MyClass
setmetatable(MyClass, {
__call = function (cls, ...)
return cls.new(...)
end,
})
function MyClass.new(init)
local self = setmetatable({}, MyClass)
self.value = init
return self
end
function MyClass:set_value(newval)
self.value = newval
end
function MyClass:get_value()
return self.value
end
local instance = MyClass(5)
-- do stuff with instance...