Menu
Coddy logo textTech

__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

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

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

challenge icon

チャレンジ

簡単

namelevel を受け取り、デフォルトのステータス値を持つキャラクターテーブルを返す関数 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
quiz icon腕試し

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

ロジックと制御フローのすべてのレッスン