为什么`Nil`被定义为`case object`

Fre*_*ind 7 null scala list case

在scala源代码中,我发现:

case object Nil extends List[Nothing] {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它被宣布为case object而不是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")
}
Run Code Online (Sandbox Code Playgroud)

你可以看到MyNil不是case object,但我仍然可以在模式匹配中使用它.这是输出:

### is nil
Run Code Online (Sandbox Code Playgroud)

我误解了什么吗?

Dav*_*ith 5

一般来说,对于不可变数据,问题永远不应该是"为什么这是一个案例对象(或类)"而是"我可以将它作为案例对象吗?".有一些小的例外(主要是由于继承),Scala中的数据元素应该是不可变的,并且应该通过case类/对象来实现.鉴于此,实现Nil和::作为案例对象和案例类(分别)只是标准做法,没有任何缺点.


sol*_*oth 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()
Run Code Online (Sandbox Code Playgroud)