__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テーブルでは固定の代替値を指定しますが、関数を使えば、見つからないキーに対する値を計算できます。
チャレンジ
簡単createCharacterWithDefaults 関数を作成します。この関数は name と level を受け取り、デフォルトのステータス値を持つキャラクターテーブルを返します。
指定された名前とレベルを持つキャラクターテーブルを作成します。メタテーブルの __index を使って、存在しないステータス(health、mana、strength)にデフォルト値を設定します。
ロジック:
- キー
health = 100、mana = 50、strength = 10を持つデフォルトテーブルを作成します - キー
name(指定された名前)とlevel(指定されたレベル)を持つキャラクターテーブルを作成します __indexがデフォルトテーブルを参照するメタテーブルを作成しますsetmetatable()を使って、メタテーブルをキャラクターテーブルに関連付けます- キャラクターテーブルを返します
パラメーター:
name(文字列): キャラクターの名前level(数値): キャラクターのレベル
戻り値: 名前、レベル、およびメタテーブルを通じて参照できるデフォルトのステータスを持つキャラクターテーブル(テーブル)
自分で試してみよう
function createCharacterWithDefaults(name, level)
-- ここにコードを書いてください
end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとプログラムの流れのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ