table.unpack と可変長引数
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 20/73。
ときどき、array 内に値があるものの、それらをseparateな値として扱う必要があります。たとえば、各 element をそれぞれ独自の argument として渡す場合です。それがtable.unpackです。array のすべての element を展開して返します。
local scores: {number} = {85, 92, 78}
print(table.unpack(scores)) -- 85 92 78 (1行、3つの値)
print(math.max(table.unpack(scores))) -- 92 — 各要素が引数になったその反対がvarargsです。...を使って任意の number の argument を受け取る function です。Lua で...を見たことがあるでしょう。Luau ではそれを型付けできるため、入ってくるすべての値が一致しなければなりません。
local function sum(...: number): number
local total = 0
for i = 1, select("#", ...) do
total += select(i, ...)
end
return total
endselect("#", ...)は到着した argument がいくつかを返し、select(i, ...)はi の位置以降の argument を返します。式の中で単一の値として使う場合、実質的には「i 番目の argument」です。
この2つの機能は組み合わせて使えます。sum(table.unpack(scores))は、array をそのまま varargs function に展開します。これは、ほかの言語で見られる spread-call パターンに対する Luau の答えです。table.unpackは array を変更せずに読み取ります。
チャレンジ
簡単85、92、78を持つ型付き配列 scores: {number} を作成します。
table.unpackを使用して、すべてのスコアを1行に出力します。math.maxとtable.unpackを使用して、最高スコアを出力します。select("#", ...)とselect(i, ...)を使用してすべての引数を加算するlocal function sum(...: number): numberを定義し、その後sum(table.unpack(scores))を出力します。- 通常の引数でも同じ関数が機能することを示すために、
sum(10, 20)を出力します。
自分で試してみよう
-- ここにコードを書いてください
-- 1) scores: {number} = {85, 92, 78} を宣言する
-- 2) print(table.unpack(scores)) と展開した scores の math.max を出力する
-- 3) select を使って sum(...: number): number を定義し、sum(table.unpack(scores)) を出力する
-- 4) sum(10, 20) を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数自分で練習してみよう: Luaオンラインコンパイラ