我不明白为什么以下情况不匹配。Null 应该是 Any 的一个实例,但它不匹配。有人可以解释发生了什么吗?
val x = (2, null)
x match {
case (i:Int, v:Any) => println("got tuple %s: %s".format(i, v))
case _ => println("catch all")
}
prints catch all
谢谢。
我不明白为什么以下情况不匹配。Null 应该是 Any 的一个实例,但它不匹配。有人可以解释发生了什么吗?
val x = (2, null)
x match {
case (i:Int, v:Any) => println("got tuple %s: %s".format(i, v))
case _ => println("catch all")
}
prints catch all
谢谢。
这与指定的完全相同。
Type patterns consist of types, type variables, and wildcards.
A type pattern T is of one of the following forms:
* A reference to a class C, p.C, or T#C.
This type pattern matches any non-null instance of the given class.
有趣的是,null 是 Any 的成员。它是除 AnyVal 和 Nothing 之外的所有类型的成员。
您是否尝试过占位v
符?
val x = (2, null)
x match {
case (i:Int, v) => println("got tuple %s: %s".format(i, v))
case _ => println("catch all")
}
这是指定的(Scala 参考 2.7,第 8.2 节):
对 C、pC 或 T#C 类的引用。此类型模式匹配给定类的任何非空实例。请注意,如果给定类的前缀,则与确定类实例相关。例如,模式 pC 仅匹配以路径 p 作为前缀创建的类 C 的实例。
我只是在这里猜测,因为我不是 scala 专家,但根据 scala 中 Any 类的文档,我认为由于 null 不是对象,它不是从 Any 派生的,因此不是匹配第一个列出的案例。
在下面添加代码示例。它在运行时打印“其他东西”。
val x = (2, null)
x match {
case (i:Int, v:Any) => println("got tuple %s: %s".format(i, v))
case (i:Int, null) => println("something else %s".format(i))
case _ => println("catch all")
}
经过更多的研究,似乎 null 应该与文档所说的任何意义相匹配,它扩展了 AnyRef,它扩展了 Any。
编辑:就像其他人所说的那样。第一种情况故意与 null 不匹配。它在文档中指定。