将元组与null匹配

时间:2010-01-08 01:13:06

标签: scala null pattern-matching tuples

我不明白为什么以下情况不匹配。 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

感谢。

4 个答案:

答案 0 :(得分:9)

这完全符合规定。

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。

答案 1 :(得分:6)

您是否尝试了任何v占位符?

val x = (2, null)
x match {
    case (i:Int, v) => println("got tuple %s: %s".format(i, v))
    case _ => println("catch all")
}

答案 2 :(得分:3)

这是指定的(Scala参考2.7,第8.2节):

  

对C,p.C或T#C类的引用。   此类型模式匹配给定类的任何非null实例。   注意类的前缀,如果   给出,是相关的   确定类实例。对于   例如,模式p.C只匹配   C类的实例   使用路径p作为前缀创建。

答案 3 :(得分:1)

我只是在这里猜测,因为我不是scala专家,但根据documentation对于scala中的Any类,我认为因为null不是一个对象,所以它不是从任何和因此不符合第一个列出的案例。

添加下面的代码示例。它在运行时打印“其他东西”。

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应与任何意义相匹配documentation表示它扩展AnyRef,扩展Any。

编辑:像其他人一样说。第一种情况不是故意匹配null。它在文档中指定。