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