斯卡拉的元组解开细微差别

Pau*_*nov 15 design-patterns scala tuples

在尝试将元组解包为val时,我在scala中注意到以下行为:

scala> val (A, B, C) = (1, 2, 3)
<console>:5: error: not found: value A
       val (A, B, C) = (1, 2, 3)
            ^
<console>:5: error: not found: value B
       val (A, B, C) = (1, 2, 3)
               ^
<console>:5: error: not found: value C
       val (A, B, C) = (1, 2, 3)
                  ^

scala> val (u, v, w) = (1, 2, 3)
u: Int = 1
v: Int = 2
w: Int = 3
Run Code Online (Sandbox Code Playgroud)

这是因为scala的模式匹配机制会自动假设所有以模式中的大写字母开头的标识符都是常量,还是由于某些其他原因?

谢谢!

oxb*_*kes 20

是的,它变得更糟:

val (i, j) : (Int, Int) = "Hello" -> "World"
Run Code Online (Sandbox Code Playgroud)

以上将在运行时编译并失败ClassCastException.很容易忘记(i, j)声明是一种模式.

编辑:对于ziggystar,Scala赋值规则在声明中声明:

val p = expr //or var
Run Code Online (Sandbox Code Playgroud)

p可以是一个标识符或图案(见第15.7节Scala中编程,PP284).例如,以下内容有效:

val x :: y :: z :: rest = List(1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

将此与模式被删除(即未选中参数类型信息)这一事实相结合意味着我的原始示例将被编译.

  • 有趣的错误......或许你应该指出它失败了,因为它相当于`Tuple2 [Int,Int]`,它被类型擦除为`Tuple2 [Any,Any]`? (5认同)

aio*_*obe 13

来自[scala]关于命名约定的问题,您可以阅读

模式匹配时,首字母大写字母具有优势.具有首字母大写字母的标识符被视为要匹配的值而不是要绑定的变量.