__index メタメソッド
CoddyのLuaジャーニー「ロジックと制御フロー」セクションの一部 — レッスン 18/54。
テーブルにメタテーブルをアタッチする方法を学んだので、最も重要なメタメソッドである __index について学ぶ時が来ました。このメタメソッドは、テーブルに存在しないキーにアクセスしようとしたときに何が起こるかを制御します。
通常、テーブルに存在しないキーを検索したとき、Luaは nil を返します。しかし、テーブルに __index フィールドを持つメタテーブルがある場合、Luaはその代わりにそのフィールドを確認します。もし __index が別のテーブルを指しているなら、Luaはそのテーブルでキーを探します。
local defaults = {
health = 100,
speed = 10
}
local player = {name = "Alice"}
local meta = {__index = defaults}
setmetatable(player, meta)
print(player.name) -- 出力: Alice
print(player.health) -- 出力: 100この例では、playerはnameキーのみを持っています。player.healthにアクセスすると、Luaはそれをplayerの中に見つけられないため、メタテーブルの__indexフィールドを確認します。__indexがdefaultsテーブルを指しているため、Luaはそこを確認し、health = 100を見つけます。
これにより、あるテーブルが別のテーブルに対してデフォルト値を提供できるフォールバックメカニズムが作成されます。元のテーブルは自身の値を保持しますが、不足しているキーはフォールバックテーブルで自動的に検索されます。
チャレンジ
簡単name と level を受け取り、デフォルトのステータス値を持つキャラクターテーブルを返す関数 createCharacterWithDefaults を作成してください。
指定された名前とレベルでキャラクターテーブルを作成します。__index を持つメタテーブルを使用して、不足しているステータス(health、mana、strength)のデフォルト値を提供してください。
ロジック:
- 次のキーを持つデフォルトテーブルを作成します:
health = 100,mana = 50,strength = 10 - 次のキーを持つキャラクターテーブルを作成します:
name(提供された名前) とlevel(提供されたレベル) - デフォルトテーブルを指す
__indexを持つメタテーブルを作成します setmetatable()を使用して、メタテーブルをキャラクターテーブルにアタッチします- キャラクターテーブルを返します
パラメータ:
name(string): キャラクターの名前level(number): キャラクターのレベル
戻り値: メタテーブルを通じてアクセス可能な名前、レベル、およびデフォルトのステータスを持つキャラクターテーブル (table)
自分で試してみよう
function createCharacterWithDefaults(name, level)
-- ここにコードを記述してください
end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。