有:
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
答案 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 )
^