Lui*_*hys 11 scala pattern-matching
def test1(a: Any) = a match {
case x: AnyRef => "AnyRef"
case _ => "None of the above"
}
def test2(a: Any) = a match {
case x: Double if x > 2 => "Double > 2"
case x: AnyRef => "AnyRef"
case _ => "None of the above"
}
Run Code Online (Sandbox Code Playgroud)
请有人解释为什么在下面,第一个案例1.0匹配AnyRef,但在第二个案例中没有.(斯卡拉2.9.0-1)
scala> test1(1.0)
res28: java.lang.String = AnyRef
scala> test2(1.0)
res29: java.lang.String = None of the above
Run Code Online (Sandbox Code Playgroud)
编辑 - Scala 2.10更新2013年1月:新模式匹配器修复了这种行为(或者至少使其保持一致),test2现在该方法返回"AnyRef" test1.
这是因为Any实际上只是一个Object.有Double有一个方便的小说-它实际上是java.lang.Double这是在匹配语句autounboxed你.不幸的是,Scala没有办法告诉它是否发现java.lang.Double它是否应该被解释为a Double或者java.lang.Double- 在后一种情况下,AnyRef应该捕获它.它确实如此.但是,如果你特别要求 a Double,它知道它应该是unbox,然后AnyRef不需要检查案例.(而且,事实上,如果你打算将它作为一个java.lang.Double,那么它也会拆开它 - 它无法区分它.)
这是否是理想的行为是值得商榷的,但这是合乎逻辑的.