scala - 如何防止这种错误-模式匹配和Nil

标签 scala

当您再次对列表进行模式匹配时,可以使用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/

相关文章:

scala - 如何创建一个解析器组合器,其中行结尾很重要?

scala - 带有 testkit sbt 的循环项目依赖项

Scala - Iterator.toList 的奇怪行为

scala - sbt 程序集中的合并策略和缺少应用程序加载程序

Scala 最佳实践 : simple Option[] usage

Scala/Dispatch 程序没有终止

scalatest "A stack"应该是 "do something"——wtf?字符串的方法应该如何?

http - 将二进制数据发布到 Scala Play Framework 网站的最佳方式

scala - 有条件地包含提供的范围依赖与 sbt 和通用插件

Scala 中的 JavaFX 2 和 setCellValueFactory()?