Rust是否支持返回多个值的函数?

77

Rust是否像Go一样原生支持返回多个值的函数?

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

看起来我们可以使用元组来模拟它。 Rosetta Code介绍了如何在不同的编程语言中返回多个值,但我没有看到Rust。

4个回答

103

这对我有用:

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

这跟Go语言基本一样,但需要加上括号。


最佳解决方案,我以前没有尝试过。看起来我们需要使用元组来模拟它。谢谢! - sunny2016
7
在Go语言中也需要使用括号。 ;) - weberc2
7
不,他们不是。(他在谈论“return”语句。) - Timmmm
8
这是最受赞同的答案,未来学习 Rust 的人很可能会在自己的工作中模仿这个。因此,将其改为符合 Rust 习惯用法;区块的返回值是其最后一个表达式。删除了 return ; 语句。 - legends2k

38

在Rust中,您可以返回包含多个值的元组:

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

返回多个值的语言可能会使用元组或其他数据结构来模拟这种情况,因为在大多数调用约定中,返回值只存在一个寄存器中。

我不确定 Go 是否也是这样,但很有可能他们只是在元组中模拟多个返回值,并在编译时强制你管理返回值。

我认为 Rust 这样做没有问题,因为 OCaml 或 Haskell(和其他语言)都是这样处理的,他们在返回值(或元组)中执行类型检查,所以出错的机会很低。最常见的管理返回值的方法是将元组解构成两个或更多绑定 (let (a, b) = tuple_2();)。

这只是我的一点建议,欢迎指正。


9
只是一个精度问题:Go 不使用元组,而是真正使用多个寄存器。请参见 https://dev59.com/vXbZa4cB1Zd3GeqPGXoU - Denys Séguret
7
从1.2.0版本开始,语法需要更改为 let (a, b) = tuple_2(); - Amol

27

这是一个示例,展示了如何将返回的元组轻松分配给单独的变量。

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

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

14
在 Rust 中,您不必使用 return 关键字:
fn addsub(x: isize, y:isize) -> (isize, isize) {
    (x + y, x - y) // use tuple to simulate it
}

4
不回答问题(解决方案的重要部分需要包括括号),但值得记住/提醒人们 Rust 是基于表达式的语言,具有隐式返回。 - zstewart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接