ドット vs コロン
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 4/70。
ドット構文とコロン構文の両方を理解したところで、それぞれをいつ使うべきか、そしてそれらを誤って混用したときに何が起こるかを理解することが不可欠です。
重要なルールは単純です:関数の定義方法と呼び出し方法を一致させる必要があります。コロンを使用して定義した場合は、コロンを使用して呼び出します。ドットと明示的な self を使用して定義した場合は、ドットを使用して呼び出し、テーブルを渡します。
これらを不一致にした場合に何が起こるかを以下に示します:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- 間違い: ドットで呼び出していますが、テーブルが渡されていません
game.addPoints(10) -- エラー! self はテーブルではなく 10 になっていますgame.addPoints(10)を呼び出すとき、Luaは自動的にgameを渡しません。値10がselfになり、予期しない動作やエラーの原因となります。
逆方向はより寛容です:
function game.reset(self)
self.score = 0
end
-- コロンを使用した呼び出し: game:reset() は game.reset(game) と同じです
game:reset() -- self は正しく game を受け取ります。そのため、これは動作しますこの特定のケースは動作するかもしれませんが、混乱を招き、特定の引数を期待する関数を壊す可能性があります。最も安全なアプローチは、一貫性を保つことです。関数が self を必要とする場合は定義と呼び出しの両方でコロンを使用し、必要としない場合はドットを使用します。
チャレンジ
簡単score フィールドを 0 で初期化した player という名前のテーブルを作成してください。
テーブルに2つの関数を追加します:
player.setScore(self, value)- ドット構文と明示的なselfパラメータを使用して定義します。self.scoreを指定された値に設定します。player:addBonus(amount)- コロン構文を使用して定義します。self.scoreにamountを加算します。
2つの入力を受け取ります:
- 初期スコアの値
- 加算するボーナス額
以下の手順を実行してください:
- ドット構文を使用して
setScoreを呼び出し(最初の引数としてテーブルを渡す)、初期スコアを設定します。 - コロン構文を使用して
addBonusを呼び出し、ボーナスを加算します。 player.scoreの最終的な値を出力します。
注意:各関数の呼び出し方は、その定義方法に合わせてください。
自分で試してみよう
-- 入力を読み込む
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())
-- TODO: 以下にコードを記述してください
-- 1. 'score' フィールドを 0 で初期化した 'player' という名前のテーブルを作成する
-- 2. 明示的な self を伴うドット構文を使用して player.setScore(self, value) を追加する
-- 3. コロン構文を使用して player:addBonus(amount) を追加する
-- 4. ドット構文を使用して setScore を呼び出す(最初の引数としてテーブルを渡す)
-- 5. コロン構文を使用して addBonus を呼び出す
-- 最終的なスコアを出力する
print(player.score)このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。