コロン構文
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 3/70。
毎回 counter.increment(counter) と書くのは、面倒で間違いが起こりやすいものです。Lua には、より簡潔な方法があります。それが colon(:)演算子です。
コロンを使用して関数を定義すると、Lua は自動的に self を最初のパラメーターとして追加します。
local player = {
name = "Hero"
}
-- 定義でコロンを使用
function player:greet()
print("Hello, I am " .. self.name)
endcolon は function を呼び出すときにも機能します。table を最初の引数として自動的に渡します:
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()colon 構文は、Lua で method を定義して Call する標準的な方法です。コードが短くなり、繰り返しも少なくなります。
チャレンジ
簡単message フィールドを持ち、入力として受け取る値で初期化された greeter という名前の table を作成します。
colon syntax を使用して、次の形式で greeting を出力する :sayHello(name) メソッドを追加します。
[message], [name]!2 つの入力を受け取ります。
greeter.messageに保存する greeting message:sayHello()メソッドに渡す name
colon syntax を使用してメソッドを定義し、colon syntax を使用して呼び出します。整形した greeting を出力します。
たとえば、message が Welcome で name が Luna の場合、出力は次のようになります。
Welcome, Luna!自分で試してみよう
-- 入力を読み取る
local message = io.read()
local name = io.read()
-- TODO: 以下にコードを書いてください
-- 1. 'greeter' という名前のテーブルを作成し、フィールド 'message' を持たせる
-- 2. コロン構文を使ってメソッド :sayHello(name) を追加する
-- 3. コロン構文を使ってメソッドを呼び出し、挨拶を出力するこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ