Разница между :: и Nil типами в Scala - PullRequest
0 голосов
/ 04 марта 2019

Я изучаю Scala, работаю со списком и создаю список строк следующим образом:

val myList = List("Laptop", "Mouse", "Keyboard", "screen")

Из документации я получил:

абстрактный класс List впакет scala, который поставляется с двумя подклассами для :: и Nil

И из определения класса я получил:

@SerialVersionUID(509929039250432923L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
  override def tail : List[B] = tl
  override def isEmpty: Boolean = false
}

@SerialVersionUID(0 - 8256821097970055419L)
case object Nil extends List[Nothing] {
  override def isEmpty = true
  override def head: Nothing =
    throw new NoSuchElementException("head of empty list")
  override def tail: List[Nothing] =
    throw new UnsupportedOperationException("tail of empty list")
  // Removal of equals method here might lead to an infinite recursion similar to IntMap.equals.
  override def equals(that: Any) = that match {
    case that1: scala.collection.GenSeq[_] => that1.isEmpty
    case _ => false
  }
}

Но документация не показывает, когда находится объект NILи когда создается объект :: subclass.

В чем разница между ними, и, пожалуйста, предложите, когда использовать :: subclass и когда NIL подкласс?

1 Ответ

0 голосов
/ 04 марта 2019

Когда вы используете синтаксис List(..), компилятор будет использовать List.apply, определенный в сопутствующем объекте List:

override def apply[A](xs: A*): List[A] = xs.toList

Вы фактически не видите создание списка, потому что оносоздается в общем благодаря тому, как определяется библиотека коллекции Scala.

Разница между :: и Nil заключается в том, что первый представляет собой связанный список, который имеет голову и хвост, а второй представляет собойпустой список, который не содержит элементов.

Мы также можем определить список, используя :: и Nil напрямую:

val list = "Laptop" :: "Mouse" :: "Keyboard" :: Nil

, который переводится в:

val list = Nil.::("Keyboard").::("Mouse").::("Laptop")

Где :: относится не к типу ::, а к методу List[A]:

def ::[B >: A] (x: B): List[B] = new scala.collection.immutable.::(x, this)
...