インデックス型定義
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 72/73。
テーブルの章で、{[string]: number}のようなマップ型に出会いました。これはインデックスシグネチャです。any文字列キーが数値の値に対応します。コードを書く時点ではキーがわからない場合に力を発揮します。カウンター、設定、キャッシュ、スコアなど、実行時に構築されるものなら何でも扱えます。
type Counts = {[string]: number}
local counts: Counts = {}
counts["potion"] = 3 -- 任意の文字列キーが許可されています
counts["sword"] = 1
counts["potion"] += 1 -- 値は数値としてチェックされますマップを扱うときは、実行時の2つの事実が重要です。まず、一度も設定されていないキーを読み取るとnilが返されます。典型的なカウントパターンでは、orを使ってこれに対処し、「missing」を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チャレンジ
簡単型付きマップで loot のドロップを数えます。
type Counts = {[string]: number}を宣言します。- 新しい
Countsマップを構築し、各 string が何回現れるかを数えるcountItems(items: {string}): Countsを記述します((counts[item] or 0) + 1パターンを使用します)。 local loot: {string} = {"potion", "sword", "potion", "shield", "potion", "sword"}を作成して、数えます。- 異なる各 item について
[name]: [count]の行を 1 行ずつ、アルファベット順で出力します。key を収集し、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
プロジェクト:タスクの型定義タスクを追加する関数自分で練習してみよう: Luaオンラインコンパイラ