コロン構文
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 3/70。
毎回 counter.increment(counter) と書くのは面倒でエラーの元になります。Lua にはより簡潔な方法が用意されています。それがコロン (:) 演算子です。
コロンを使用して関数を定義すると、Luaは自動的に最初のパラメータとして self を追加します:
local player = {
name = "Hero"
}
-- 定義でコロンを使用
function player:greet()
print("Hello, I am " .. self.name)
endコロンは関数を呼び出す際にも機能します。テーブルが最初の引数として自動的に渡されます:
player:greet() -- 出力: Hello, I am Heroこれは player.greet(player) と書くのと同等ですが、はるかにすっきりしています。コロンは定義時と呼び出し時の両方で self パラメータを自動的に処理します。
両方のアプローチが同一の結果を生成することを示す比較は以下の通りです:
local counter = { value = 0 }
-- ドット構文 (明示的な self)
function counter.increment(self)
self.value = self.value + 1
end
counter.increment(counter)
-- コロン構文 (自動的な self)
function counter:decrement()
self.value = self.value - 1
end
counter:decrement()コロン構文は、Luaにおいてメソッドを定義・呼び出す標準的な方法です。これにより、コードがより短く、反復の少ないものになります。
チャレンジ
簡単入力として受け取る値で初期化された field message を持つ、greeter という名前の table を作成します。
colon syntax を使用してメソッド :sayHello(name) を追加し、次の形式で greeting を print します。
[message], [name]!2つの input を受け取ります:
greeter.messageに保存するgreetingmessage:sayHello()methodに渡すname
colon syntax を使用して method を definition し、colon syntax を使用してそれを Call します。整形された greeting を print してください。
例えば、message が Welcome で name が Luna の場合、Output は次のようになります:
Welcome, Luna!自分で試してみよう
-- 入力を読み取る
local message = io.read()
local name = io.read()
-- TODO: 以下にコードを書いてください
-- 1. 'greeter' という名前のテーブルを作成し、フィールド 'message' を持たせる
-- 2. コロン構文を使ってメソッド :sayHello(name) を追加する
-- 3. コロン構文を使ってメソッドを呼び出し、挨拶を出力するこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。