为什么是
var a,b,c = (0,0,0)
允许但不允许:
var a,b,c = (0,0,0)
(a,b,c) = (0,0,0) <<< fails to compile
a,b,c = (0,0,0) <<< fails to compile
为什么是
var a,b,c = (0,0,0)
允许但不允许:
var a,b,c = (0,0,0)
(a,b,c) = (0,0,0) <<< fails to compile
a,b,c = (0,0,0) <<< fails to compile
你大概是说
var (a,b,c) = (0,0,0)
因为你写的是多重赋值,而不是模式匹配。
原因只是风格。Scala 倾向于使用不可变值,但允许您使用可变值。Scala - 不仅在这里 - 非常缺乏方便的功能来帮助您使用可变值。
在这种情况下,您可以使用模式匹配来初始化 vars 应该被认为是一种祝福!
您正在寻找内插器。
var a, b, c = 0
def pairing: Product = (11, 12)
*(a, b) = pairing
(0,0,0)
是一个Tuple3
scala> var a,b,c = (0,0,0)
a: (Int, Int, Int) = (0,0,0)
b: (Int, Int, Int) = (0,0,0)
c: (Int, Int, Int) = (0,0,0)
每个变量a
, b
,c
都受到元组的影响
相反,当你这样做时
scala> var (a,b,c) = (0,0,0)
a: Int = 0
b: Int = 0
c: Int = 0
a
, b
,c
很简单Int
,Scala 使用 的提取器方法Tuple3
来解构对象。
val
您可以在不使用or的情况下引入绑定的唯一方法var
是在 for 理解或模式匹配中。正如 Rex 显示的那样,您要使用的表格是val (a, b, c) = (0, 1, 2)
. 这被称为“无可辩驳的模式匹配”,因为右侧与val
. 并且不限于TupleN
. 例如:
case class CC1(i: Int, d: Double, s: String)
val CC1(j, e, t) = CC1(1, 2.0, "three")
j: Int = 1
e: Double = 2.0
t: String = three