Menu
Coddy logo textTech

属性の初期化

CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 9/70。

学習した :new() コンストラクタはオブジェクトを作成しますが、すべてのインスタンスは最初は同一です。実際のオブジェクトには固有のデータが必要です。例えば、人には特定の名前があり、プレイヤーには開始スコアがあります。オブジェクトを便利にするには、コンストラクタが引数を受け取り、それらを新しいインスタンスに割り当てる必要があります。

初期値を受け取れるようにコンストラクタを拡張する方法は次のとおりです:

local Dog = {}
Dog.__index = Dog

function Dog:new(name, breed)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.breed = breed
    return instance
end

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

コンストラクタは、namebreed を引数として受け取るようになりました。空のインスタンスを作成してメタテーブルを設定した後、これらの値をインスタンスのフィールドに直接代入します。作成された各オブジェクトは、独自の namebreed を持つことになります。

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- 出力: 私はRex、German Shepherdです
dog2:introduce()  -- 出力: 私はBella、Poodleです

両方の犬はプロトタイプから同じ :introduce() メソッドを共有していますが、それぞれが自身のインスタンステーブルに格納された独自の名前と犬種を持っています。これが、プロトタイプとパラメータ化されたコンストラクタを組み合わせることの強みです。つまり、個別の状態を持ちながら振る舞いを共有できるのです。

challenge icon

チャレンジ

簡単

独自の名前と年齢を持つ個別の人物を作成する Person クラスを構築しましょう。適切なモジュール構造を練習するために、コードを2つのファイルに分けて整理します。

以下のものを作成します:

  • Person.lua: 名前と年齢を受け取るコンストラクタを持つ Person クラスを定義します。各人物が自己紹介を行うための :introduce() メソッドを含めてください。
  • main.lua: Person モジュールを require し、提供された入力を使用して人物のインスタンスを作成します。その後、その人物に自己紹介をさせてください。

:new(name, age) コンストラクタは両方の値を受け取り、新しいインスタンスに保存する必要があります。:introduce() メソッドは、以下の正確な形式で出力する必要があります:

Hello, my name is [name] and I am [age] years old

2つの入力を受け取ります:

  1. 人物の名前
  2. 人物の年齢

例えば、入力が Alice25 の場合、出力は以下のようになります:

Hello, my name is Alice and I am 25 years old

チートシート

固有のデータを持つオブジェクトを作成するには、:new() コンストラクタを拡張してパラメータを受け取り、それらをインスタンスに割り当てるようにします:

local Dog = {}
Dog.__index = Dog

function Dog:new(name, breed)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.breed = breed
    return instance
end

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

異なる値を持つインスタンスを作成します:

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- 出力: I am Rex, a German Shepherd
dog2:introduce()  -- 出力: I am Bella, a Poodle

各オブジェクトは、プロトタイプからメソッドを共有しながら、独自のインスタンス・テーブルに格納された固有のデータを持ちます。

自分で試してみよう

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

-- 入力を読み込む
local name = io.read()
local age = io.read()

-- TODO: Person:new(name, age) を使用して新しい Person インスタンスを作成する

-- TODO: 作成した person インスタンスの introduce() メソッドを呼び出す
quiz icon腕試し

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

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