【问题标题】:Why `Nil` is defined as `case object`为什么`Nil`被定义为`case object`
【发布时间】:2014-08-21 01:20:27
【问题描述】:

在 scala 源码中,我发现:

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

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

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

序列化的默认实现

因为我们经常将数据列表发送给另一个参与者,所以 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

我是不是误会了什么?

【问题讨论】:

    标签: list scala case null


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      正如该链接问题的 cmets 中所述,您得到的一件事是更漂亮的 .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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-30
        • 2012-12-05
        • 1970-01-01
        相关资源
        最近更新 更多