:new() コンストラクタ
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 8/70。
オブジェクトを手動で作成し、empty table を作り、その metatable を設定して、__index をリンクする作業は、繰り返しになります。標準的な解決策は、これらすべてを代わりに処理する :new() constructor method を class に直接 Define することです。
パターンは次のとおりです:
local Dog = {}
Dog.__index = Dog
function Dog:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function Dog:bark()
print("Woof!")
end:new() の内部で何が起きるのかを詳しく見てみましょう。まず、instance という名前の empty table を作成します。次に、その metatable を self に設定します。Dog:new() を呼び出した場合、これは Dog です。
Dog.__index が Dog 自体を指しているため、インスタンスは Dog で定義されたすべてのメソッドを見つけられます。最後に、新しいオブジェクトを返します。
constructor の外側にある行 Dog.__index = Dog に注目してください。これは一般的なショートカットで、別の metatable を作成する代わりに、class table が prototype と metatable の両方の役割を果たします。
これで、オブジェクトの作成がすっきりと一貫したものになります:
local myDog = Dog:new()
myDog:bark() -- 出力: Woof!作成するすべてのclassは、この同じ構造に従います。:new() constructorがオブジェクトの作成を行う唯一の場所になるため、コードが整理され、予測しやすくなります。
チャレンジ
簡単今学んだ標準的なコンストラクターパターンを使って、Cat classを作りましょう。適切な module構造を練習するために、コードを2つのファイルに分けて整理します。
次のものを作成します:
Cat.lua:完全なコンストラクターパターンを使ってCatclassをDefineします。classには次のものを含めます:- 自身を指す
__indexを持つclass table - instanceを作成し、そのmetatableを設定して返す
:new()コンストラクター - 猫の鳴き声を出力する
:meow()method
- 自身を指す
main.lua:Cat moduleをRequireし、コンストラクターをusingして猫のinstanceを作成します。その後、そのmethodをCallして、すべてが正しくリンクされていることを確認します。
inputとして、猫がmeowするtimesのnumberを1つ受け取ります。
:meow() methodは、exactly次の内容を出力する必要があります:
Meow!mainファイルでCat:new()をusingして猫を作成し、specifiedされたtimesだけ:meow()をCallします。
たとえば、inputが3の場合、Outputは次のようになります:
Meow!
Meow!
Meow!自分で試してみよう
-- Catモジュールを読み込む
local Cat = require('Cat')
-- 入力を読み取る: 鳴く回数
local times = tonumber(io.read())
-- TODO: Cat:new()を使って猫のインスタンスを作成する
-- TODO: 指定された回数だけ:meow()メソッドを呼び出す
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ