複数の戻り値
1回の関数呼び出しから複数の値を返し、受け取ります。
「複数の戻り値」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
複数の値を返す
多くの言語とは異なり、Luaの関数は1つの return 文から複数の値をネイティブに返せます。複数の値は return の後にカンマで区切って記述します。これにより、ラッパーオブジェクトや出力引数は必要ありません。
local function divmod(a, b)
return math.floor(a / b), a % b
end
local quotient, remainder = divmod(17, 5)
print(quotient, remainder) -- 3 2戻り値の調整
Luaは、受け取り側の数に合わせて戻り値を調整します。余分な値は破棄され、不足している値は nil になります。この調整は、関数呼び出しがリスト内の最後の式でない場合に行われます。その位置では、最初の値だけが保持されます。
local function triple()
return 10, 20, 30
end
local a, b, c = triple()
print(a, b, c) -- 10 20 30
local x, y = triple()
print(x, y) -- 10 20 (30 discarded)
local p = triple()
print(p) -- 10 (only first when 1 var)中間位置での調整
関数呼び出しが式のリストの中間(最後以外の位置)にある場合、Luaはその結果を1つの値に切り詰めます。複数の値を生成できるのは、リスト内の最後の式だけです。
local function pair()
return 1, 2
end
-- pair() in middle: only 1 value used
local t = {pair(), pair()}
print(#t, t[1], t[2], t[3]) -- 3 1 1 2
-- first pair() gives just 1; last pair() gives 1,2
-- pair() at end: all values used
local t2 = {10, pair()}
print(#t2, t2[1], t2[2], t2[3]) -- 3 10 1 2括弧で単一の値を強制する
関数呼び出しを括弧で囲むと、戻り値が必ず1つになります。関数がいくつの値を返しても、最初の戻り値だけが必要な場合に便利です。
local function coords()
return 10, 20, 30
end
print(coords()) -- 10 20 30 (all three)
print((coords())) -- 10 (parentheses: single value only)
local x = (coords())
print(x) -- 10string.findの戻り値
標準ライブラリの多くの関数は複数の値を返します。string.find は、一致した箇所の開始位置と終了位置(およびキャプチャ)を返します。math.modf は整数部分と小数部分を返します。こうしたパターンを理解すると、標準ライブラリを自在に使えるようになります。
local s = "hello world"
local start, finish = string.find(s, "world")
print(start, finish) -- 7 11
-- math.modf: integer and fractional parts
local int, frac = math.modf(3.75)
print(int, frac) -- 3 0.75table.packで捕捉する
table.pack(...) はすべての引数(または ... を介した戻り値)をテーブルに格納します。テーブルには、nil値も含めた合計数を示す n フィールドが含まれます。最初の空き要素で停止する # とは異なり、正確な個数を保持できます。
local function getData()
return "Alice", 30, nil, true
end
local t = table.pack(getData())
print(t.n) -- 4
print(t[1]) -- Alice
print(t[2]) -- 30
print(t[3]) -- nil
print(t[4]) -- truetable.unpackで展開する
table.unpack(t, i, j) は、テーブルの要素を個別の値として返します。これは table.pack の逆の操作です。テーブルの内容を関数の引数として渡したり、return文で値を展開したりする場合に使用します。
local args = {10, 20, 30}
local function sum3(a, b, c)
return a + b + c
end
print(sum3(table.unpack(args))) -- 60
-- Use in return
local function passThrough(t)
return table.unpack(t)
end
print(passThrough({5, 6, 7})) -- 5 6 7エラー形式の戻り値
Luaでは、失敗時に nil, errorMessage を返し、成功時に結果を返すのが一般的な慣例です。呼び出し側は最初の戻り値を確認します。nilならエラーが発生しています。これにより、想定される失敗に対して例外を使わずに済みます。
local function openConfig(path)
local f = io.open(path, "r")
if not f then
return nil, "cannot open: " .. path
end
local content = f:read("*a")
f:close()
return content
end
local data, err = openConfig("config.lua")
if not data then
print("Error:", err)
end複数の戻り値で入れ替える
複数の戻り値を使うと、値の入れ替えを簡潔に実現できます。右辺は代入前に評価されるため、a, b = b, a で一時変数を使わずに値を正しく交換できます。
local a, b = 5, 10
print(a, b) -- 5 10
a, b = b, a
print(a, b) -- 10 5
-- Works for three-way rotation too
local x, y, z = 1, 2, 3
x, y, z = z, x, y
print(x, y, z) -- 3 1 2pcallの戻り値の規約
pcall(f, ...) 自体が複数の値を返します。最初の値はブール値で、成功時は true、エラー時は false です。それ以降の値は、f の戻り値、またはエラーメッセージになります。残りの値を使う前に、必ず最初の戻り値を確認してください。
local function risky(x)
if x < 0 then error("negative input") end
return math.sqrt(x)
end
local ok, result = pcall(risky, 16)
print(ok, result) -- true 4.0
ok, result = pcall(risky, -1)
print(ok, result) -- false input:2: negative input確認問題
print((string.find("hello", "ll"))) は何を出力しますか?
復習:複数の戻り値
要点:
- 複数の値を返すには
return a, b, cと記述します - 余分な値は破棄され、不足している値はnilになります
- 中間位置の呼び出しは1つの値に切り詰められます
(f())は値を必ず1つにします- 動的な値のリストには
table.pack/table.unpackを使用します - 慣例として、失敗時には
nil, errmsgを返します
よくある質問
「複数の戻り値」レッスンは無料ですか?
はい。「複数の戻り値」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「複数の戻り値」で何を学びますか?
1回の関数呼び出しから複数の値を返し、受け取ります。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「複数の戻り値」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。