可変長引数関数 (...)
CoddyのLuaジャーニー「ロジックと制御フロー」セクションの一部。レッスン 11/54。
任意の数の引数を扱える関数が必要になることがあります。2つ、3つ、あるいは10個の数の合計を、それぞれの場合に別々の関数を書かずに計算したいこともあるでしょう。Luaには、そのための特別な構文、3つのドット ... があります。
関数のパラメータリストに ... を配置すると、任意の数の引数を受け取る可変長引数関数になります:
function sum(...)
-- 関数本体
end関数内では、...を再び使用してこれらの引数にアクセスできます。より簡単に扱うには、中かっこを使ってそれらをtableにまとめます。
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() を使用して、他のテーブルと同じようにこのテーブルを反復処理できます。
チャレンジ
簡単任意の個数の数値引数を受け取り、それらの平均を返す関数 calculateAverage を作成してください。
可変個数の引数を受け取るには可変長引数構文 ... を使用し、それらをテーブルにまとめ、合計を計算して個数で割ってください。
注: 「Don't touch this code」と記されたスターターコードは、入力から数値を読み取り、それぞれを tonumber() を使ってテキストから数値に変換し、numbers というテーブルに格納します。最後に、unpack(numbers) を使って関数を呼び出します。これはテーブルの値を個別の引数として展開するため、関数はそれらを ... として受け取ります。このコードを詳しく変更したり理解したりする必要はありません。calculateAverage の作成に集中してください。
ロジック:
{...}を使ってすべての引数をテーブルにまとめる- テーブルを反復処理して、すべての数値の合計を計算する
- 合計を引数の個数で割って平均を求める
- 平均を数値として返す
パラメーター:
...(numbers): 可変個数の数値引数
戻り値: 指定されたすべての数値の平均(数値)
自分で試してみよう
-- このコードに触れないで --
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
local average = calculateAverage(unpack(numbers))
print("Average: " .. average)
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックと制御フローのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ