Menu
Coddy logo textTech

ゲッターメソッド

CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 13/70。

self.healthself.itemsのようなインスタンス変数にデータを格納する方法を学びました。オブジェクトの外部からこれらのフィールドに直接アクセスすることもできますが、よりすっきりした方法があります。それは、ゲッターメソッドをusingすることです。

getter(アクセサメソッドとも呼ばれます)は、内部の値を返すシンプルなメソッドです。player.healthに直接アクセスする代わりに、player:getHealth()を呼び出します。

local Player = {}
Player.__index = Player

function Player:new(name)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.health = 100
    return instance
end

function Player:getHealth()
    return self.health
end

function Player:getName()
    return self.name
end

なぜ余分なmethodを用意するのでしょうか? ゲッターはあなたのdataへの制御されたアクセスポイントを提供します。

現時点では、:getHealth()は単に値を返します。しかし後で、ロジックを追加したくなるかもしれません。たとえば、healthが10未満に下がった場合に"Critical"を返したり、healthが確認されるたびにログを記録したりすることが考えられます。

getter を用意しておけば、オブジェクトを使用するコードを変更せずに、これらの変更を行えます。

local hero = Player:new("Luna")
print(hero:getHealth())  -- 出力: 100
print(hero:getName())    -- 出力: Luna

このパターンは、オブジェクトの内部構造と、他のコードがオブジェクトとどのようにやり取りするかの間に、明確な境界を作ります。外部のコードは、オブジェクトのフィールドに直接アクセスするのではなく、メソッドを通じてデータを要求します。

challenge icon

チャレンジ

簡単

Player class を構築し、getter メソッドを使って内部データにアクセスしましょう。player のフィールドに直接アクセスする代わりに、player の情報への制御されたアクセスを提供するメソッドを作成します。

コードは2つのファイルに分けて整理します。

  • Player.lua:標準的な prototype pattern を使って Player class を Define します。Constructor は名前を受け取り、health を 100 に Initialize します。次の3つの getter メソッドを追加します。
    • :getName() は player の名前を returns します
    • :getHealth() は player の current health を returns します
    • :getStatus() は両方の情報を組み合わせた formatted string を returns します
  • main.lua:Player module を Require し、player instance を Create します。getter メソッドを使って player の情報を表示します。フィールドを直接読み取るのではなく、すべてメソッドを通してアクセスしてください。

:getStatus() method は、次の exact format の string を returns する必要があります。

[name] has [health] HP

入力は1つです。player の名前が与えられます。

main file で、given name を使って player を Create し、その後、getter メソッドを使って3行を Print します。

  1. player の名前(:getName() を using)
  2. player の health(:getHealth() を using)
  3. player の full status(:getStatus() を using)

たとえば、input が Luna の場合、Output は次のようになります。

Luna
100
Luna has 100 HP

自分で試してみよう

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

-- 入力を読み取る
local name = io.read()

-- TODO: 指定された名前でプレイヤーインスタンスを作成する

-- TODO: :getName()を使ってプレイヤーの名前を出力する

-- TODO: :getHealth()を使ってプレイヤーの体力を出力する

-- TODO: :getStatus()を使ってプレイヤーのステータスを出力する
quiz icon腕試し

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

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

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