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