web-dev-qa-db-ja.com

Rustは複数の値を返す関数をサポートしていますか?

Rustは、Goなどの複数の値を返す関数をネイティブでサポートしていますか?

func addsub(x, y int) (int, int) {
    return x + y, x - y
}

タプルを使用してシミュレーションできるようです。 ロゼッタコード は、異なる言語で複数の値を返す方法を紹介しますが、Rustは表示されませんでした。

45
sunny2016

これは私にとってはうまくいきます:

fn addsub(x: isize, y: isize) -> (isize, isize) {
    (x + y, x - y)
}

基本的にはGoと同じですが、括弧が必要です。

57
Jason Orendorff

Rustでは、複数の値を持つタプルを返すことができます:

_fn my_func() -> (u8, bool) {
    (1, true)
}
_

ほとんどの呼び出し規約では戻り値は1つのレジスタにしか存在しないため、値よりも多くを返す言語は、タプルまたは別のデータ構造でこれをエミュレートしている可能性があります。

Goについてはわかりませんが、タプル内の複数の値をエミュレートし、コンパイル時に強制的に戻り値を管理している可能性が高いです。

RustこれはOCamlまたはHaskell(および他の人)がそれを管理する方法であり、それらが戻り値(またはタプル)で型チェックを実施するため、何かを行う可能性があるため)戻り値を管理する最も一般的な方法は、2つ以上のバインディングでタプルを分解することです(let (a, b) = Tuple_2();)。

ちょうど私の2セント、私を修正してお気軽に。

26
snf

Rustでは、returnキーワードを使用する必要はありません:

fn addsub(x: isize, y:isize) -> (isize, isize) {
    (x + y, x - y) // use Tuple to simulate it
}
10
user3419211

以下は、戻りタプルを個別の変数に簡単に割り当てる方法を示す例です。

fn addsub(x: isize, y: isize) -> (isize, isize) {
    (x + y, x - y) // use Tuple to simulate it
}

let (a, b) = addsub(1, 2);
9
paulhauner