кортеж соответствия с пустым указателем

Я не понимаю, почему следующий случай не соответствует. Пустой указатель должен быть экземпляром Любого, но он не соответствует. Кто-то может объяснить, что продолжается?

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

Спасибо.

6
задан agilefall 8 January 2010 в 01:13
поделиться

4 ответа

Это именно то, что указано.

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.

Интересно, что столько значимости было приписано нулевому члену Any. Это член каждого типа, кроме AnyVal и Nothing.

9
ответ дан 8 December 2019 в 12:20
поделиться

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

val x = (2, null)
x match {
    case (i:Int, v) => println("got tuple %s: %s".format(i, v))
    case _ => println("catch all")
}
6
ответ дан 8 December 2019 в 12:20
поделиться

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

После дополнительных исследований кажется, что ноль должен совпадать с любым смыслом. В документации документация говорит, что он расширяет AnyRef, который расширяет Any.

EDIT: Как и все остальные сказали. Первый случай не совпадает с нулем специально. Это указано в документации.

1
ответ дан 8 December 2019 в 12:20
поделиться

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

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

3
ответ дан 8 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: