Menu
CoddyTech

__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を見つけます。

これにより、一方のテーブルがもう一方のテーブルにデフォルト値を提供するフォールバック機構が作られます。元のテーブルは独自の値を保持しますが、欠けているキーは自動的にフォールバックテーブルで検索されます。

__indexは関数にすることもできます。キーが見つからない場合、Luaはテーブルとキーを渡してその関数を呼び出し、関数が返した値を使用します。

local scores = {alice = 12}

setmetatable(scores, {
    __index = function(t, key)
        return 0  -- 存在しない名前はすべて0として扱う
    end
})

print(scores.alice)  -- 出力: 12
print(scores.bob)    -- 出力: 0

テーブルでは固定の代替値を指定しますが、関数を使えば、見つからないキーに対する値を計算できます。

challenge icon

チャレンジ

簡単

createCharacterWithDefaults 関数を作成します。この関数は name と level を受け取り、デフォルトのステータス値を持つキャラクターテーブルを返します。

指定された名前とレベルを持つキャラクターテーブルを作成します。メタテーブルの __index を使って、存在しないステータス(health、mana、strength)にデフォルト値を設定します。

ロジック:

  • キー health = 100、mana = 50、strength = 10 を持つデフォルトテーブルを作成します
  • キー name(指定された名前)と level(指定されたレベル)を持つキャラクターテーブルを作成します
  • __index がデフォルトテーブルを参照するメタテーブルを作成します
  • setmetatable() を使って、メタテーブルをキャラクターテーブルに関連付けます
  • キャラクターテーブルを返します

パラメーター:

  • name(文字列): キャラクターの名前
  • level(数値): キャラクターのレベル

戻り値: 名前、レベル、およびメタテーブルを通じて参照できるデフォルトのステータスを持つキャラクターテーブル(テーブル)

自分で試してみよう

function createCharacterWithDefaults(name, level)
    -- ここにコードを書いてください
end
quiz icon腕試し

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

ロジックとプログラムの流れのすべてのレッスン

自分で練習してみよう: Luaオンラインコンパイラ