Menu
Coddy logo textTech

__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

この例では、playername キーのみを持っています。player.health にアクセスすると、Luaはそれを player の中で見つけられないため、メタテーブルの __index フィールドを確認します。__indexdefaults テーブルを指しているため、Luaはそこを確認し、health = 100 を見つけます。

これにより、あるテーブルが別のテーブルに対してデフォルト値を提供できるフォールバックメカニズムが作成されます。元のテーブルは自身の値を保持しますが、不足しているキーはフォールバックテーブルで自動的に検索されます。

challenge icon

チャレンジ

簡単

namelevel を受け取り、デフォルトのステータス値を持つキャラクターテーブルを返す関数 createCharacterWithDefaults を作成してください。

提供された名前とレベルでキャラクターテーブルを作成します。不足しているステータス(healthmanastrength)のデフォルト値を提供するために、__index を持つメタテーブルを使用してください。

ロジック:

  • health = 100mana = 50strength = 10 というキーを持つデフォルトテーブルを作成します。
  • name(提供された名前)と level(提供されたレベル)というキーを持つキャラクターテーブルを作成します。
  • デフォルトテーブルを指す __index を持つメタテーブルを作成します。
  • setmetatable() を使用して、メタテーブルをキャラクターテーブルにアタッチします。
  • キャラクターテーブルを返します。

パラメータ:

  • name (string): キャラクターの名前
  • level (number): キャラクターのレベル

戻り値: メタテーブルを介してアクセス可能な namelevel、およびデフォルトのステータスを持つキャラクターテーブル (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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン