使用Scala中的函数返回的多个值更新变量

时间:2019-02-26 14:44:06

标签: scala

假设我有一个函数可以在scala中返回多个值。

def foo:(Double, Double) = {
    (1.1, 2.2)
}

我可以按如下方式调用它。

val bar = foo 

val (x, y) = foo

但是,如果我尝试更新如下所示的现有变量,则无法正常工作。

var x = 1.0
var y = 2.0
(x, y) = foo

这将返回一个错误,提示error: ';' expected but '=' found

这背后是否有任何原因。为什么我不能使用(x, y) = foo

更新现有变量

1 个答案:

答案 0 :(得分:3)

多次分配的语法实际上是模式匹配的一个示例。所以这个

val (x, y) = foo
...

相当于

foo match {
  case (x, y) =>
    ...

这意味着您可以使用以下更高级的模式匹配语法:

val f @ (x, y) = foo

或这个

val (x, _) = foo

但是模式匹配只能用于将值提取到新变量中,而不能用于更新现有变量,这就是为什么最后一部分代码无法编译的原因。无论如何,Scala代码都倾向于避免使用var,因此对于大多数程序而言,这并不是主要问题。