0Pricing
Lua Academy · レッスン

複数の戻り値

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)           -- 10

string.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.75

table.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])        -- true

table.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  2

pcallの戻り値の規約

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 関数の定義と呼び出し
  2. 複数の戻り値
  3. 可変長引数と...演算子
  4. Luaの再帰
← Lua Academyに戻る