syntax - 元组参数声明和赋值奇怪

标签 syntax scala tuples

我可以按如下方式分配一个元组:

var (min, max) = (1, 2)

但我不能按如下方式重新分配
(min, max) = (1, 3) //compiler error: ';' expected but '=' found

相反,我似乎必须这样做:
min = 1
max = 3

为什么后者有效而前者无效?

最佳答案

嗯,因为它是那样指定的,我想。

这,元组分配,是模式匹配的一个例子。模式匹配发生在我记得的三个地方:

var PATTERN = ... // or val

for (PATTERN <- ...) ...

case PATTERN => ...

所以所有这些情况都有效:
val l = List((1,'a'), (2,'b'), (3,'c'))
var (n, c) = l(0)
for ((n, c) <- l) println(n+": "+c)
l(1) match {
  case (n, c) => println(n+": "+c)
}

现在,以最后一个例子为例,使用 case 的例子.请注意 nc在那个例子中是 不是 一样nc定义得早一点。模式匹配将为新标识符分配值 nc ,这将影响 case 的范围的先前定义陈述。同样的事情发生在 for 上例如,没有改变 nc先前定义。

现在,您想要发生的是覆盖以前的值,而不是为新标识符分配新值。这不是模式匹配的工作方式,这意味着实现它需要一个全新的规则。由于 Scala 温和地促使人们走向不变性,我认为他们没有创建新规则来处理这个问题并不是没有道理的。

关于syntax - 元组参数声明和赋值奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1624484/

相关文章:

python - 列表应该总是转换为元组吗?

syntax - 为什么 trait bound 出现在 where 子句中而不出现在函数签名中?

ruby - Ruby 2.1.1 中使用 else 语句的定义语法

C++:前向声明时指针大小未知(错误 C2036)

scala - 递归地向数据框添加行

json - Play Json 递归读取

python - Pandas:如何根据表示两列中的值的元组列表从数据框中删除行?

assembly - 冒号 : mean in x86 assembly GAS syntax as in %ds:(%bx)? 是什么意思

java - 在 Java 中使用 scala 列表和枚举

list - Haskell 列表到元组