当您再次对列表进行模式匹配时,可以使用Nil检查空列表。但是,如果基础类型是Iterable,则仍然可以检查是否为Nil,并且它将为空Set中断,等等。请参阅以下REPL session :
scala> val l: Iterable[Int] = List()
l: Iterable[Int] = List()
scala> l match {
| case Nil => 1
| case _ => 2
| }
res0: Int = 1
scala> val l: Iterable[Int] = Set()
l: Iterable[Int] = Set()
scala> l match {
| case Nil => 1
| case _ => 2
| }
res2: Int = 2
问题是-如何防止此类问题?显然,如果l是一个List类型,那就没有问题。如果l的类型为Set,则不会编译。但是,如果我们有一个具有列表的类,定义一个以这种方式与模式匹配的函数,然后有人更改该类以采用通用的可迭代方法,该怎么办呢?通常,Nil vs. _模式匹配一个坏主意吗?
最佳答案
将scrutinee转换为列表以消除疑问。
l.toList match {
case Nil => 1
case xs => 2
}
关于scala - 如何防止这种错误-模式匹配和Nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9347994/