Подтвердить что ты не робот

Поддерживает ли Rust функции, возвращающие несколько значений?

Есть ли у Rust встроенная поддержка функций, возвращающих несколько значений, таких как Go?

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

Кажется, мы могли бы использовать кортеж, чтобы имитировать его. Rosetta Code представляет, как вернуть несколько значений на разных языках, но я не видел Rust.

4b9b3361

Ответ 1

Это работает для меня:

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

Это в основном то же, что и в Go, но скобки необходимы.

Ответ 2

В Rust вы можете вернуть кортеж с более чем одним значением:

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

Язык, возвращающий больше, чем значение, вероятно, эмулирует это с помощью кортежа или другой структуры данных, как и в большинстве соглашений о вызовах, возвращаемое значение находится только в одном регистре.

Не могу сказать о Go, но есть большие шансы, что они просто эмулируют несколько значений внутри кортежа и время компиляции, заставляя вас управлять возвратами.

Я не вижу никаких проблем с ржавкой, выполняющей это, так как это управляет ocaml или haskell (и другими), и они обеспечивают проверку типов в возвращаемых значениях (или кортежей), поэтому вероятность того, что что-то пойдет не так, низка. Наиболее распространенным способом управления возвращаемыми значениями является деконструирование кортежа в двух или более привязках (let a, b = tuple_2()).

Просто мои два цента, не стесняйтесь исправлять меня.

Ответ 3

В Rust вам не нужно использовать ключевое слово return:

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