def f() = {
(1, "two", 3.0)
}
为什么OK
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
?
def f() = {
(1, "two", 3.0)
}
为什么OK
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
?
在初始化变量时,您会看到模式匹配的限制版本。注意这不仅为元组:
val a :: b = List(1,2,3)
println(a) //1
println(b) //List(2, 3)
这个功能似乎是直接从哈斯克尔,借来的地方可以使用的模式进行初始化,以及:
let (a,b) = getTuple
in a*b
由于Haskell有没有可变数据,没有办法分配一些东西。
在斯卡拉你可能做这样的事情,但我想这被认为太混乱,或者太难实施。像往常一样,您总是可以使用match
表达式,并且通常只需要一个case
,例如, List((1,2),(3,4)).map{ case (a,b) => a*b }
。
我怀疑,如果没有变量名称元组左侧的“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)
^