ドット vs コロン
CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 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が2回渡されます
game:reset() -- selfはgameを受け取りますが、余分なnil引数も期待されますこの特定のケースは動作するかもしれませんが、混乱を招き、特定の引数を期待する関数を壊す可能性があります。最も安全なアプローチは、一貫性を保つことです。関数が self を必要とする場合は定義と呼び出しの両方にコロンを使用し、必要としない場合はドットを使用します。
チャレンジ
簡単score フィールドを 0 で初期化した player という名前のテーブルを作成してください。
テーブルに2つの関数を追加します:
player.setScore(self, value)- ドット構文と明示的なselfパラメータを使用して定義します。self.scoreを与えられた値に設定します。player:addBonus(amount)- コロン構文を使用して定義します。self.scoreにamountを加算します。
2つの入力を受け取ります:
- 初期スコアの値
- 加算するボーナス額
以下の手順を実行してください:
- 初期スコアを設定するために、ドット構文を使用して
setScoreを呼び出します(最初の引数としてテーブルを渡します)。 - ボーナスを加算するために、コロン構文を使用して
addBonusを呼び出します。 player.scoreの最終的な値を出力します。
注意:各関数の呼び出し方は、その定義方法に合わせてください。
チートシート
Luaでメソッドを定義および呼び出す際、構文を一致させる必要があります:
- コロン (
:) で定義した場合は、コロンで呼び出します - ドット (
.) と明示的なselfで定義した場合は、ドットで呼び出し、テーブルを渡します
誤った使用法 - コロンで定義したものをドットで呼び出す場合:
function game:addPoints(points)
self.score = self.score + points
end
game.addPoints(10) -- エラー! self はテーブルではなく 10 になります誤った使用法 - ドットで定義したものをコロンで呼び出す場合:
function game.reset(self)
self.score = 0
end
game:reset() -- 混乱を招く:game は自動的に渡されますが、問題が発生する可能性があります正しい使用法 - 構文を一致させる:
-- コロンで定義し、コロンで呼び出す
function game:addPoints(points)
self.score = self.score + points
end
game:addPoints(10)
-- ドットで定義し、ドットで呼び出す
function game.reset(self)
self.score = 0
end
game.reset(game)自分で試してみよう
-- 入力を読み込む
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)このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。