元组只能在变量声明中解压缩吗?

时间:2013-10-26 00:27:41

标签: scala

为什么

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 个答案:

答案 0 :(得分:3)

你可能意味着

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

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

原因只是风格。 Scala倾向于使用不可变值,但允许您使用可变值。 Scala - 不仅在这里 - 非常简便,可以帮助您处理可变值。

您可以使用模式匹配初始化变量应该被视为该上下文中的祝福!

答案 1 :(得分:1)

您正在寻找the intupolator.

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

  *(a, b) = pairing

答案 2 :(得分: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)

每个变量abc都会受到元组的影响

相反,当你这样做时

scala> var (a,b,c) = (0,0,0)
a: Int = 0
b: Int = 0
c: Int = 0

abc很简单Int,Scala使用Tuple3的提取器方法来解构对象。

答案 3 :(得分:0)

您可以在不使用valvar的情况下引入绑定的唯一方法是进行理解或模式匹配。正如Rex所示,你要去的形式是val (a, b, c) = (0, 1, 2)。这被称为“无可辩驳的模式匹配”,因为没有适应右侧和val之后的模式之间的错误匹配。它不仅限于TupleN。 E.g:

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