2012-10-25 5 views

ответ

6

Предполагая, что я понимаю, что вы правильно значит, последовательность, которая не содержит в себе ничего пуст, который Nil:

case Nil => //do thing for empty seq 

Это работает, даже если вы имеете дело с Seq с, не Lists:

scala> Seq() 
res0: Seq[Nothing] = List() 

scala> Seq() == Nil 
res1: Boolean = true 

Еще один выход REPL, чтобы показать, что это работает в полном соответствии с другими подклассами Seq:

scala> Nil 
res3: scala.collection.immutable.Nil.type = List() 

scala> val x: Seq[Int] = Vector() 
x: Seq[Int] = Vector() 

scala> x == Nil 
res4: Boolean = true 

scala> x match { case Nil => "it's nil" } 
res5: java.lang.String = it's nil 

scala> val x: Seq[Int] = Vector(1) 
x: Seq[Int] = Vector(1) 

scala> x match { case Nil => "it's nil"; case _ => "it's not nil" } 
res6: java.lang.String = it's not nil 

Как видно из приведенного выше результата, Nil - это тип, который является его собственным. У этого question есть несколько интересных вещей, которые можно сказать по этому поводу.

Но @dhg правильно, что если вы вручную создать конкретный подтип, такие как вектор, матч не работает:

scala> val x = Vector() 
x: scala.collection.immutable.Vector[Nothing] = Vector() 

scala> x match { case Nil => "yes"} 
<console>:9: error: pattern type is incompatible with expected type; 
found : object Nil 
required: scala.collection.immutable.Vector[Nothing] 
       x match { case Nil => "yes"} 

Сказав это, я не знаю, почему вы должны были бы заставить ваш объекты, которые часто называют конкретным конкретным подклассом.

+0

Говоря 'Seq()' 'вызовы List()' за кулисами начиная с 'Seq' является интерфейсом. Тем не менее, 'List' - это не единственная реализация' Seq', только по умолчанию. Попробуйте с помощью * any * другого типа 'Seq', и он потерпит неудачу. – dhg

+0

@dhg '(Vector(): Seq [Int]) соответствует {case Nil =>" match "case _ =>" no "}' возвращает "соответствие" –

+0

@Luigi, но 'Vector() соответствует {case Nil = > "match" case _ => "no"} 'does not. Я нахожу неправильный матч странным. – dhg

9

Сопоставление с пустой последовательности выглядит следующим образом:

val x: Seq[Nothing] = Vector() 

x match { 
    case Seq() => println("empty sequence") 
} 

EDIT: Обратите внимание, что это является более общим, чем case NilNil, поскольку является подклассом только List, не Seq вообще. Как ни странно, компилятор в порядке с сопоставлением с Nil, если тип явно аннотируется как Seq, но он будет жаловаться, является ли этот тип подклассом ListSeq. Таким образом, вы можете сделать это:

(Vector(): Seq[Int]) match { case Nil => "match" case _ => "no" } 

, но не это (с ошибкой времени компиляции):

Vector() match { case Nil => "match" case _ => "no" } 
+0

лучше удалить мой ответ! – Russell

+0

Я только что протестировал это в консоли, и я думаю, что он будет работать. – Russell

+0

Добавили некоторые ответы на мой ответ, чтобы показать это в действии. – Russell

Смежные вопросы