Menu
Coddy logo textTech

: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.__indexDog自身を指しているため、インスタンスはDogで定義されたすべてのメソッドを見つけることができます。最後に、新しいオブジェクトを返します。

コンストラクタの外にある Dog.__index = Dog という行に注目してください。これは一般的なショートカットです。別のメタテーブルを作成する代わりに、クラスのテーブルがプロトタイプとメタテーブルの両方の役割を果たします。

これで、オブジェクトの作成がクリーンで一貫したものになります:

local myDog = Dog:new()
myDog:bark()  -- 出力: Woof!

作成するすべてのクラスは、この同じ構造に従います。:new() コンストラクタは、オブジェクトの作成が行われる唯一の場所となり、コードを整理され、予測可能なものにします。

challenge icon

チャレンジ

簡単

学んだばかりの標準的なコンストラクタパターンを使用して、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() メソッドを呼び出す
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Object Oriented Programmingのすべてのレッスン