Menu
Coddy logo textTech

コロン構文

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

毎回 counter.increment(counter) と書くのは、面倒で間違いが起こりやすいものです。Lua には、より簡潔な方法があります。それが colon(:)演算子です。

コロンを使用して関数を定義すると、Lua は自動的に self を最初のパラメーターとして追加します。

local player = {
    name = "Hero"
}

-- 定義でコロンを使用
function player:greet()
    print("Hello, I am " .. self.name)
end

colon は 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 する標準的な方法です。コードが短くなり、繰り返しも少なくなります。

challenge icon

チャレンジ

簡単

message フィールドを持ち、入力として受け取る値で初期化された greeter という名前の table を作成します。

colon syntax を使用して、次の形式で greeting を出力する :sayHello(name) メソッドを追加します。

[message], [name]!

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

  1. greeter.message に保存する greeting message
  2. :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. コロン構文を使ってメソッドを呼び出し、挨拶を出力する
quiz icon腕試し

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

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

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