【问题标题】:Scala assigning multiple returned values from a functionScala从一个函数分配多个返回值
【发布时间】:2014-05-10 18:31:15
【问题描述】:

给定这个 Scala 函数

def mv: (Int,Int,Int) = {
  (1,2,3)
}

以下作品

val (i,j,k) = mv

但这不是

var i = 0
var j = 0
var k = 0
(i,j,k) = mv
<console>:1: error: ';' expected but '=' found.
   (i,j,k) = mv
           ^

这意味着分配给多个变量仅在初始化时才有效?或者我写错了?试图找到一种方法从函数返回多个值并将这些值分配给类中的实例变量,这意味着在调用函数时无法初始化变量,因为它们是在所有方法之外声明的。

class C {
  var i = 0
  var j = 0
  var k = 0
  def mv: (Int,Int,Int) = {
    (1,2,3)
  }
  def changeState: Unit = {
    (i,j,k) = mv
  }
}

以上行不通。我可以创建一个案例类来保存返回值,但我想做一些这样的工作,因为它看起来更清楚。

【问题讨论】:

  • 请注意在初始提案中更新以下 cmets。

标签: scala


【解决方案1】:

我找到了一种让它工作的方法,但它似乎是错误的:

class C {
  var i = 0
  var j = 0
  var k = 0
  def mv: (Int,Int,Int) = {
    (1,2,3)
  }
  def changeState: Unit = {
    val (x,y,z) = mv
    i = x
    j = y
    k = z
  }
}

val c = new C
c.i == 0 //true
c.changeState
c.i == 1 //true so this works

所以它可以工作,但很丑

【讨论】:

  • 无论如何,这是最好的解决方案。 Scala 不支持多重赋值(ScalaReference 第 6.15 节)。请参阅 stackoverflow.com/questions/3348751/…stackoverflow.com/questions/2776651/scala-tuple-deconstruction @user3189923 的答案有误导性。
  • 是的,太糟糕了,但确实如此。 Scala 隐含地确定要做什么,因此有时会隐藏真正发生的事情。这通常很好,它可以减少冗长的代码,但它也可以掩盖问题。我认为多值返回实际上是一个隐藏的 Tupple3[Int,Int,Int]。
猜你喜欢
  • 2021-12-21
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2018-04-30
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
相关资源
最近更新 更多