Menu
CoddyTech

インデックスシグネチャ

CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 78/80。

テーブルの章で、{[string]: number}のようなマップ型を学びました。これはインデックスシグネチャで、任意の文字列キーが数値に対応します。コードを書く時点ではキーがわからない場合に役立ちます。カウンター、設定、キャッシュ、スコアなど、実行時に構築されるものに使えます。

type Counts = {[string]: number}

local counts: Counts = {}
counts["potion"] = 3   -- 文字列ならどのキーでも使えます
counts["sword"] = 1
counts["potion"] += 1  -- 値は数値としてチェックされます

マップを扱う際には、実行時の性質を2つ押さえておきましょう。まず、一度も設定されていないキーを読み取るとnilが返ります。よく使われるカウントのパターンでは、orを使って「値がない」場合を0にします。

counts[item] = (counts[item] or 0) + 1

次に、pairs()はマップのキーを順序を保証せずに反復処理します。同じプログラムを2回実行しても、キーを異なる順序で処理することがあります。出力を予測可能にする必要がある場合は、キーを配列に集め、table.sortで並べ替えてから、並べ替えた配列を反復処理します。

local keys: {string} = {}
for key in pairs(counts) do
    table.insert(keys, key)
end
table.sort(keys)
for _, key in ipairs(keys) do
    print(`{key}: {counts[key]}`)
end
challenge icon

チャレンジ

簡単

名前が事前にわからないプレイヤーのスコアを記録します。

  1. type Scores = {[string]: number}と書き、local scores: Scores = {}を作成します。
  2. ポイントを加算します:scores["mia"] = (scores["mia"] or 0) + 5、次に"leo"についても同様に3を加算します。
  3. scores["mia"]、scores["leo"]、scores["zed"]を出力します。

コードを実行を押します。出力には5、3、nilが表示されます。

自分で試してみよう

-- 1) type Scores = {[string]: number} と定義し、次に local scores: Scores = {} とする
-- 2) "mia" に 5 ポイント、"leo" に 3 ポイントを追加する
-- 3) mia、leo、zed を出力する

Luau入門のすべてのレッスン

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