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