List 为什么将“Nil”定义为“case object”`
在scala source中,我发现:List 为什么将“Nil”定义为“case object”`,list,scala,case,null,List,Scala,Case,Null,在scala source中,我发现: case object Nil extends List[Nothing] { ... } 我不明白为什么它被声明为案例对象而不是对象 我发现这个问题[]很有用,我想这个原因是关键: 序列化的默认实现 因为我们经常将数据列表发送给另一个参与者,所以Nil必须是可序列化的,对吗 根据提供的答案(谢谢),我尝试编写一些代码来验证它: trait MyList[+T] object MyNil extends MyList[Nothing] va
case object Nil extends List[Nothing] {
...
}
我不明白为什么它被声明为案例对象
而不是对象
我发现这个问题[]很有用,我想这个原因是关键:
序列化的默认实现
因为我们经常将数据列表发送给另一个参与者,所以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对象
,但我仍然可以在模式匹配中使用它。以下是输出:
### is nil
我误解了什么吗?正如在链接问题的评论中提到的,你得到的是一个更漂亮的
.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()
一般来说,对于不可变数据,问题永远不应该是“为什么这是一个case对象(或类)”,而应该是“我能把它变成一个case对象吗?”。除了一些小的例外(主要是由于继承),Scala中的数据元素应该是不可变的,并且应该通过case类/对象实现。有鉴于此,将Nil和::分别作为case对象和case类实现只是标准实践,没有任何缺点