インデックス型定義
CoddyのLuaジャーニー「Luau入門」セクションの一部 — レッスン 72/73。
テーブルの章で {[string]: number} のようなマップ型(インデックスシグネチャ)に触れました。これは任意の string 型のキーが number 型の値に対応することを示します。コードを書いている段階でキーが何であるか分からない場合(カウンタ、設定、キャッシュ、スコアなど、実行時に構築されるものすべて)に真価を発揮します。
type Counts = {[string]: number}
local counts: Counts = {}
counts["potion"] = 3 -- 任意の文字列キーが許可されています
counts["sword"] = 1
counts["potion"] += 1 -- 値は数値としてチェックされますマップを操作する際、実行時の重要な事実が2つあります。1つ目は、設定されていないキーを読み込むと nil が返されることです。定番のカウントパターンでは or を使用して「存在しない(missing)」状態を 0 に変換して処理します:
counts[item] = (counts[item] or 0) + 12つ目は、pairs() によるマップのキーのイテレート順序が保証されない(guaranteed order がない)ことです。同じプログラムを2回実行した場合でも、キーを走査する順序が異なる場合があります。出力結果に予測可能性が必要な場合は、キーを array に収集して 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チャレンジ
簡単型定義されたマップを使用して戦利品のドロップをカウントします。
type Counts = {[string]: number}を宣言します。- 各文字列の出現回数をカウントする新しい
Countsマップを作成するcountItems(items: {string}): Countsを記述します((counts[item] or 0) + 1パターンを使用します)。 local loot: {string} = {"potion", "sword", "potion", "shield", "potion", "sword"}を作成してカウントします。- 重複しないアイテムごとに
[name]: [count]の行をアルファベット順で出力します:キーを収集し、table.sortでソートしてから出力します。
期待される出力:
potion: 3
shield: 1
sword: 2自分で試してみよう
-- ここにコードを書いてください
-- 1) type Counts = {[string]: number}
-- 2) countItems(items: {string}): Counts を (counts[item] or 0) + 1 を使って
-- 3) タスクの loot 配列をカウントする
-- 4) キーを集め、table.sort し、`{name}: {count}` の行を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数