Scala并行分配仅在声明中

时间:2011-04-21 17:44:06

标签: scala variable-assignment

有:

def f () = {
    (1, "two", 3.0)
}

为什么没问题

var (x, y, z) = f()

但不是


var i = 0
var j = "hello"
var k = 0.0

// use i, j, k
...
//then
(i, j, k) = f() // ; expected but = found

2 个答案:

答案 0 :(得分:6)

在初始化变量时,您会看到模式匹配的限制版本。请注意,这不仅适用于元组:

val a :: b = List(1,2,3)
println(a) //1
println(b) //List(2, 3)

这个功能似乎是直接从Haskell借用的,你可以在那里使用模式进行初始化:

let (a,b) = getTuple 
in a*b

由于Haskell没有可变数据,因此无法分配内容。

在Scala中你可以做这样的事情,但我想这被认为太混乱,或者可能太难实现。您可以像往常一样使用match表达式,通常只需case,例如List((1,2),(3,4)).map{ case (a,b) => a*b }

答案 1 :(得分:2)

我怀疑,如果没有变量名元组左侧的“var”或“val”,编译器会将元组视为元组。也就是说,你真的试图为Tuple3的实例赋值而不是三个变量,这对编译器没有意义。

顺便说一句,在您的示例中使用函数和各种数据类型是不相关的。这是一个更简单的例子:

scala> var ( i, j, k ) = ( 1, 2, 3 )
i: Int = 1
j: Int = 2
k: Int = 3

scala> ( i, j, k ) = ( 4, 5, 6 )
<console>:1: error: ';' expected but '=' found.
       ( i, j, k ) = ( 4, 5, 6 )
                   ^