関数/メソッドから複数の値を返すには(多値返却)

関数は普通は返り値を1つだけ返すか、1つも返さない(C言語のvoidなど)ものが多い中、プログラミング言語によっては複数の値を関数から返すことができる。

返すことができる言語でも、配列で返すというのは個人的にはとても気持ち悪い。 Scalaのタプルで返す仕組みは扱いやすい、と感じるが、静的型付けか動的型付けかの違いか。

C言語 / C++

簡単に複数の戻り値を返す方法はなさそう。

値を受け取る専用の変数をポインタで引数として渡して、関数からは結果をポインタの指す先に書き込むことができる。このポインタを複数受け渡しすれば結果的に複数の結果を受け渡すことができる。

Go言語

普通に関数から多値を返却できる。

package main

import "fmt"

func main() {
    i, s := f()
    fmt.Printf("%d %s\n", i, s)
    // => 1 abc
}

func f() (int, string) {
    return 1, "abc"
}

返り値のそれぞれがなんなのかがわかりやすいように返り値に名前を書くことができる。

func f() (i int, s string) {
    i = 1
    s = "abc"
    return i, s
}

i, s は返り値の変数としてすでに宣言されているので、関数定義の本体では変数宣言なしに使える。

Java

簡単に複数の戻り値を返す方法はなさそう。

Scala

タプルを返せばよい。

def f() = {
  (1, "abc");
}

val (a, b) = f();

println(a); // => 1
println(b); // => abc

返り値の一部が不要な場合は、アンダースコアを使う。

val (a, _) = f();

PHP

複数の値を直接返すことはできないが、配列を使って無理やりやろうと思えばできなくもない。

function f(){
  return array(1, "abc");
}

list($num, $str) = f();
echo "$num\n"; # => 1
echo "$str\n"; # => abc

返り値 | PHP Manual
http://www.php.net/manual/ja/functions.returning-values.php

Python

リストまたはタプルを使えば、関数から複数値を返せる。受け取る方は変数名をコンマ区切りで複数書くだけ。

def f():
    return (1, "abc")
    # 以下のようにリストにしても同じ
    # return [1, "abc"]

a, b = f()
print(a) # => 1
print(b) # => abc

返り値の一部が不要な場合は、アンダースコアだけの変数名を使って、不要であることを明示するのがよい。

a, _ = f()

Ruby / JRuby

return にカンマ区切りで複数の値を書けば、配列を返すことになり、受け取り側は配列の多重代入を使う。

def f
  return 1, "abc"
end

num, str = f
p num # => 1
p str # => "abc"

Perl

関数からはリストを返して、受け取り側は多重代入を使えばよい。

sub f {
    return (1, "abc");
}
my ($num, $str) = f;
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク