【问题标题】:Does Rust have support for functions that return multiple values?Rust 是否支持返回多个值的函数?
【发布时间】:2013-08-31 00:56:53
【问题描述】:

Rust 是否对 Go 等返回多个值的函数提供原生支持?

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

看来我们可以用一个元组来模拟它。 Rosetta Code介绍了不同语言如何返回多个值,但是没看到Rust。

【问题讨论】:

    标签: rust


    【解决方案1】:

    这对我有用:

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

    与Go中基本相同,但括号是必需的。

    【讨论】:

    • 最好的解决方案,我之前没试过。看来我们不得不使用元组来模拟它。谢谢!
    • Go 中也需要括号。 ;)
    • 不,他们不是。 (他说的是return 声明。)
    • 这是最受欢迎的答案,未来的 Rust 学习者很可能会在自己的工作中模仿这一点。因此将其更改为惯用的 Rust;块的返回值是它的最后一个表达式。删除了return ; 语句。
    【解决方案2】:

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

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

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

    不能说 Go,但很有可能他们只是在一个元组中模拟多个值,编译时迫使你管理返回。

    我认为 rust 这样做没有任何问题,因为这是 OCaml 或 Haskell(和其他人)管理它的方式,并且它们在返回值(或元组)中强制进行类型检查,因此出现问题的可能性很低。管理返回值的最常用方法是在两个或多个绑定中解构元组 (let (a, b) = tuple_2();)。

    只是我的两分钱,请随时纠正我。

    【讨论】:

    【解决方案3】:

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

    fn addsub(x: isize, y: isize) -> (isize, isize) {
        (x + y, x - y) // use tuple to simulate it
    }
    
    let (a, b) = addsub(1, 2);
    

    【讨论】:

      【解决方案4】:

      在 Rust 中,您不必使用 return 关键字:

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

      【讨论】:

      • 不回答问题(解决方案的重要部分是需要包含括号),但值得记住/提醒人们,Rust 是一种基于表达式的隐式返回语言。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 2011-03-15
      • 1970-01-01
      相关资源
      最近更新 更多