Menu
CoddyTech

可変長引数関数 (...)

CoddyのLuaジャーニー「ロジックとプログラムの流れ」セクションの一部。レッスン 11/54。

任意の数の引数を扱える関数が必要になることがあります。場合ごとに別々の関数を書くことなく、2つ、3つ、あるいは10個の数値の合計を計算したいこともあるでしょう。Luaでは、そのための特別な構文として、3つのドット ... が用意されています。

関数のパラメーターリストに...を置くと、任意の数の引数を受け取る可変長関数になります。

function sum(...)
    -- 関数の本体
end

関数の中では、...を再び使うことで、これらの引数にアクセスできます。より簡単に扱うには、中かっこを使ってテーブルにまとめることができます。

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- 出力: 30
print(sum(1, 2, 3, 4, 5))  -- 出力: 15

式 {...} は、関数に渡されたすべての引数を含むリスト形式のテーブルを作成します。その後、長さ演算子 # や ipairs() を使って、ほかのテーブルと同じようにこのテーブルを反復処理できます。

引数がnilでない限り、これは機能します。nilがあるとテーブルに隙間ができ、隙間のあるテーブルでは#は信頼できません。select("#", ...)は、nilも含めて常に引数の数を返します。

function countArgs(...)
    return select("#", ...)
end

print(countArgs(10, 20, 30))        -- 出力: 3
print(countArgs(10, nil, 30, nil))  -- 出力: 4
challenge icon

チャレンジ

簡単

任意の数の数値引数を受け取り、その平均を返す関数 calculateAverage を作成してください。

可変長引数の構文 ... を使って任意の数の引数を受け取り、それらをテーブルに格納し、合計を計算して、個数で割ってください。

注意: スターターコード("Don't touch this code" と記されている部分)は入力から数値を読み取り、それぞれをテキストから数値に変換するために tonumber() を使い、numbers というテーブルに格納します。最後に、unpack(numbers) を使って関数を呼び出します。これはテーブルの値を個別の引数として展開するため、関数はそれらを ... として受け取ります。このコードを変更したり、細かく理解したりする必要はありません。calculateAverage の作成に集中してください。

ロジック:

  • {...} を使ってすべての引数をテーブルに格納する
  • テーブルを反復処理して、すべての数値の合計を計算する
  • 合計を引数の数で割って平均を求める
  • 平均を数値として返す

引数:

  • ...(数値): 任意の数の数値引数

戻り値: 指定されたすべての数値の平均(数値)

自分で試してみよう

-- このコードは変更しないでください --
local numbers = {}
while true do
    local input = io.read()
    if input == nil or input == "" then
        break
    end
    local num = tonumber(input)
    if num then
        table.insert(numbers, num)
    end
end
-------------------------

function calculateAverage(...)
    -- ここにコードを書いてください
end
quiz icon腕試し

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

ロジックとプログラムの流れのすべてのレッスン

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