сопоставить кортеж с нулем - PullRequest
6 голосов
/ 08 января 2010

Я не понимаю, почему следующий случай не совпадает. 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 ]

9 голосов
/ 08 января 2010

Это точно так, как указано.

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.

6 голосов
/ 08 января 2010

Вы пробовали заполнить v для что-нибудь ?

val x = (2, null)
x match {
    case (i:Int, v) => println("got tuple %s: %s".format(i, v))
    case _ => println("catch all")
}
3 голосов
/ 08 января 2010

Это так, как указано (Scala Reference 2.7, раздел 8.2):

Ссылка на класс C, p.C или T # C. Этот тип шаблона соответствует любому ненулевому экземпляру данного класса. Обратите внимание, что префикс класса, если дано, актуально для определение экземпляров классов. За Например, шаблон p.C соответствует только экземпляры классов С, которые были создается с путем p в качестве префикса.

1 голос
/ 08 января 2010

Я просто догадываюсь здесь, так как я не эксперт по scala, но согласно документации для класса Any в scala, я думаю, что, поскольку 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.

РЕДАКТИРОВАТЬ: Как все говорили. Первый случай не соответствует нулю специально. Это указано в документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...