在scala源代码中,我发现:
case object Nil extends List[Nothing] {
...
}
我无法理解为何将其声明为case object
而不是object
?
我发现这个问题[Difference between case object and object]很有用,我猜这个原因是关键:
序列化的默认实现
因为我们经常将数据列表发送给另一个actor,所以Nil必须是可序列化的,对吗?
通过提供的答案(谢谢),我尝试编写一些代码来验证它:
trait MyList[+T]
object MyNil extends MyList[Nothing]
val list: MyList[String] = MyNil
list match {
case MyNil => println("### is nil")
case _ => println("### other list")
}
您可以看到MyNil
不是case object
,但我仍然可以在模式匹配中使用它。这是输出:
### is nil
我误解了什么吗?
答案 0 :(得分:5)
一般来说,对于不可变数据,问题永远不应该是"为什么这是一个案例对象(或类)"而是#34;我可以将它作为案例对象吗?"。有一些小的例外(主要是由于继承),Scala中的数据元素应该是不可变的,并且应该通过case类/对象来实现。鉴于此,实现Nil和::作为案例对象和案例类(分别)只是标准做法,没有任何缺点。
答案 1 :(得分:2)
正如相关问题的评论中提到的,你得到的一件事是更漂亮的.toString
结果
scala> MyNil.toString
res0: String = MyNil$@51aa572b
scala> case object MyNil2 extends MyList[Nothing]
defined module MyNil2
scala> MyNil2.toString
res2: String = MyNil2
scala> Nil.toString
res1: String = List()