Menu
Coddy logo textTech

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

constructor の外側にある行 Dog.__index = Dog に注目してください。これは一般的なショートカットで、別の metatable を作成する代わりに、class table が prototype と metatable の両方の役割を果たします。

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

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

作成するすべてのclassは、この同じ構造に従います。:new() constructorがオブジェクトの作成を行う唯一の場所になるため、コードが整理され、予測しやすくなります。

challenge icon

チャレンジ

簡単

今学んだ標準的なコンストラクターパターンを使って、Cat classを作りましょう。適切な module構造を練習するために、コードを2つのファイルに分けて整理します。

次のものを作成します:

  • Cat.lua:完全なコンストラクターパターンを使ってCat classをDefineします。classには次のものを含めます:
    • 自身を指す__indexを持つclass table
    • instanceを作成し、そのmetatableを設定して返す:new()コンストラクター
    • 猫の鳴き声を出力する:meow() method
    ファイルの最後でclass tableをReturnします。
  • 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!
REQUIRED OUTPUT FORMAT: [Your translated content here]

自分で試してみよう

-- Catモジュールを読み込む
local Cat = require('Cat')

-- 入力を読み取る: 鳴く回数
local times = tonumber(io.read())

-- TODO: Cat:new()を使って猫のインスタンスを作成する

-- TODO: 指定された回数だけ:meow()メソッドを呼び出す
quiz icon腕試し

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

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Luaオンラインコンパイラ