对象扩展特征v.s类扩展特征

时间:2019-10-16 03:33:36

标签: scala

我们声明object Nil扩展TweetList有什么好处? 为什么不仍然使用class Nil

trait TweetList {
  def head: Tweet
  def tail: TweetList
  def isEmpty: Boolean
  def foreach(f: Tweet => Unit): Unit =
    if (!isEmpty) {
      f(head)
      tail.foreach(f)
    }
}

object Nil extends TweetList {
  def head = throw new java.util.NoSuchElementException("head of EmptyList")
  def tail = throw new java.util.NoSuchElementException("tail of EmptyList")
  def isEmpty = true
}

class Cons(val head: Tweet, val tail: TweetList) extends TweetList {
  def isEmpty = false
}

1 个答案:

答案 0 :(得分:1)

这里是a link,介绍如何使用单例类。

上面的评论中也提到了这一点,但是我再次解释。

在scala中,object声明用于单个对象。 在这种情况下,Nil的作用是代表“空虚”,并用作连续cons的最后一个参数

cons(a, Nil) => List(a)
cons(a, cons(b, Nil)) => List(a, b)

那么为什么Nilobject并扩展了List?原因,

  • 零用作List空度的单一表示。

我们不需要多个Nil实例。 cons的第二个参数是List类型也很有意义。