web-dev-qa-db-fra.com

Rust prend-il en charge les fonctions renvoyant plusieurs valeurs?

Rust prend-il en charge, de manière native, les fonctions qui renvoient plusieurs valeurs, comme Go?

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

Il semble que nous pourrions utiliser un tuple pour le simuler. Rosetta Code explique comment renvoyer plusieurs valeurs dans différentes langues, mais je n’ai pas vu Rust.

30
sunny2016

Cela fonctionne pour moi:

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

C'est fondamentalement la même chose que dans Go, mais les parenthèses sont obligatoires.

38
Jason Orendorff

Dans Rust, vous pouvez retourner un tuple avec plusieurs valeurs:

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

Un langage renvoyant plus d'une valeur émule probablement cela avec un tuple ou une autre structure de données, comme dans la plupart des conventions d'appel, la valeur de retour se trouve dans un seul registre.

Impossible de parler de Go, mais il y a de fortes chances qu'ils ne fassent que simuler les multiples valeurs d'un tuple et que le temps de compilation vous oblige à gérer les retours.

Ceci ne me pose aucun problème, car c'est ainsi qu'OCaml ou Haskell (et d'autres) le gèrent, et ils imposent la vérification du type dans les valeurs de retour (ou Tuple), de sorte que les risques de problèmes sont faibles. La manière la plus courante de gérer les valeurs de retour consiste à décomposer le tuple en plusieurs liaisons (let (a, b) = Tuple_2();).

Juste mes deux cents, n'hésitez pas à me corriger.

17
snf

Dans Rust, vous n'avez pas à utiliser le mot clé return :

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

Voici un exemple montrant comment vous pouvez facilement affecter le tuple de retour à des variables distinctes.

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

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