属性の初期化
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コンストラクタは、name と breed を引数として受け取るようになりました。空のインスタンスを作成してメタテーブルを設定した後、これらの値をインスタンスのフィールドに直接代入します。作成された各オブジェクトは、独自の name と breed を持つことになります。
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- 出力: 私はRex、German Shepherdです
dog2:introduce() -- 出力: 私はBella、Poodleです両方の犬はプロトタイプから同じ :introduce() メソッドを共有していますが、それぞれが自身のインスタンステーブルに格納された独自の名前と犬種を持っています。これが、プロトタイプとパラメータ化されたコンストラクタを組み合わせることの強みです。つまり、個別の状態を持ちながら振る舞いを共有できるのです。
チャレンジ
簡単独自の名前と年齢を持つ個別の人物を作成する Person クラスを構築しましょう。適切なモジュール構造を練習するために、コードを2つのファイルに分けて整理します。
以下のものを作成します:
Person.lua: 名前と年齢を受け取るコンストラクタを持つPersonクラスを定義します。各人物が自己紹介を行うための:introduce()メソッドを含めてください。main.lua: Person モジュールをrequireし、提供された入力を使用して人物のインスタンスを作成します。その後、その人物に自己紹介をさせてください。
:new(name, age) コンストラクタは両方の値を受け取り、新しいインスタンスに保存する必要があります。:introduce() メソッドは、以下の正確な形式で出力する必要があります:
Hello, my name is [name] and I am [age] years old2つの入力を受け取ります:
- 人物の名前
- 人物の年齢
例えば、入力が Alice と 25 の場合、出力は以下のようになります:
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() メソッドを呼び出す
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。