Предполагая, что я понимаю, что вы правильно значит, последовательность, которая не содержит в себе ничего пуст, который 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"}
Сказав это, я не знаю, почему вы должны были бы заставить ваш объекты, которые часто называют конкретным конкретным подклассом.
Говоря 'Seq()' 'вызовы List()' за кулисами начиная с 'Seq' является интерфейсом. Тем не менее, 'List' - это не единственная реализация' Seq', только по умолчанию. Попробуйте с помощью * any * другого типа 'Seq', и он потерпит неудачу. – dhg
@dhg '(Vector(): Seq [Int]) соответствует {case Nil =>" match "case _ =>" no "}' возвращает "соответствие" –
@Luigi, но 'Vector() соответствует {case Nil = > "match" case _ => "no"} 'does not. Я нахожу неправильный матч странным. – dhg