__index メタメソッド
CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 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 を作成してください。
提供された名前とレベルでキャラクターテーブルを作成します。不足しているステータス(health、mana、strength)のデフォルト値を提供するために、__index を持つメタテーブルを使用してください。
ロジック:
health = 100、mana = 50、strength = 10というキーを持つデフォルトテーブルを作成します。name(提供された名前)とlevel(提供されたレベル)というキーを持つキャラクターテーブルを作成します。- デフォルトテーブルを指す
__indexを持つメタテーブルを作成します。 setmetatable()を使用して、メタテーブルをキャラクターテーブルにアタッチします。- キャラクターテーブルを返します。
パラメータ:
name(string): キャラクターの名前level(number): キャラクターのレベル
戻り値: メタテーブルを介してアクセス可能な name、level、およびデフォルトのステータスを持つキャラクターテーブル (table)
チートシート
__index メタメソッドは、テーブルに存在しないキーにアクセスしようとしたときに何が起こるかを制御します。
テーブルに別のテーブルを指す __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これにより、あるテーブルが別のテーブルにデフォルト値を提供できるフォールバックメカニズムが作成されます。元のテーブルは自身の値を保持しますが、不足しているキーはフォールバックテーブルで自動的に検索されます。
自分で試してみよう
function createCharacterWithDefaults(name, level)
-- ここにコードを記述してください
end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。