Menu
Coddy logo textTech

table.unpack と可変長引数

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

配列内に値があり、それらを*個別*の値として必要とする場合があります — 例えば、各要素を独自の引数として渡すためなどです。それが table.unpack です。配列のすべての要素を展開して返します。

local scores: {number} = {85, 92, 78}
print(table.unpack(scores))     -- 85  92  78  (1行、3つの値)
print(math.max(table.unpack(scores))) -- 92 — 各要素が引数になった

その対となる機能が varargs です。... を介して任意の数の引数を受け取る関数です。Lua で ... を見たことがあるかもしれませんが、Luau ではそれに型を指定(type)できるため、渡されるすべての値が一致する必要があります:

local function sum(...: number): number
    local total = 0
    for i = 1, select("#", ...) do
        total += select(i, ...)
    end
    return total
end

select("#", ...) は届いた引数が**いくつ**あるかを返し、select(i, ...) は*位置 i 以降*の引数を返します — 式の中で単一の値として使用される場合、これは実質的に「i 番目の引数」となります。

この2つの機能は連携します:sum(table.unpack(scores)) は配列を vararg 関数へ直接展開します — これは他の言語で見られるスプレッド呼び出しパターンに対する Luau の解決策です。table.unpack は配列を変更せずに読み取ります。

challenge icon

チャレンジ

簡単

859278 を含む型定義された array scores: {number} を作成します。

  1. table.unpack を使用して、すべての scoresone line に出力します。
  2. math.maxtable.unpack を使用して、最高のスコアを出力します。
  3. select("#", ...)select(i, ...) を使用してすべての argument を加算する local function sum(...: number): numberdefine し、sum(table.unpack(scores))print します。
  4. sum(10, 20)print して、同じ function が通常の argument でも動作することを示します。

自分で試してみよう

-- ここにコードを書いてください
-- 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) を出力する
quiz icon腕試し

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

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