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

标签 list scala case null

在Scala源中,我发现:

case object Nil extends List[Nothing] {
    ...
}

我不明白为什么它被声明为 case object而不是 object ?

我发现了这个问题 [ Difference between case object and object ] 很有用,我想这个原因是关键:

default implementations of serialization



因为我们经常向另一个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

我误解了什么吗?

最佳答案

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

关于list - 为什么 `Nil` 被定义为 `case object`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24494043/

相关文章:

python - 如何在具有各种数据类型的列表中搜索字符串,如果它们存在则对它们执行操作?

java - 让 List.remove(Object o) 通过 id 删除且不等于

arrays - Scala 数组映射函数文档 (PSSQ #1​​)

sql - 在 Oracle SQL 中连接表和获取数据时出现问题

mysql - mysql中使用CASE将行转换为列

mysql - 根据匹配的列值插入值

jquery - 使用 jquery 悬停效果定位列表

Python 列出并对随机生成的数字进行排序

scala - Play build.scala 到 build.sbt 不适用于 secureSocial 插件。我不明白为什么?

scala - opencv 3.0.0 java imread_0 未定义