1

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...
4

1 に答える 1