2

为什么是

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
4

4 回答 4

3

你大概是说

var (a,b,c) = (0,0,0)

因为你写的是多重赋值,而不是模式匹配。

原因只是风格。Scala 倾向于使用不可变值,但允许您使用可变值。Scala - 不仅在这里 - 非常缺乏方便的功能来帮助您使用可变值。

在这种情况下,您可以使用模式匹配来初始化 vars 应该被认为是一种祝福!

于 2013-10-26T00:48:08.933 回答
1

您正在寻找内插器。

  var a, b, c = 0
  def pairing: Product = (11, 12)

  *(a, b) = pairing
于 2013-10-26T07:12:44.013 回答
1

(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来解构对象。

于 2013-10-26T09:48:29.777 回答
0

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
于 2013-10-26T02:12:53.283 回答