Как List (1,2,3) работает в Scala? - PullRequest
4 голосов
/ 27 сентября 2011

Как это работает в Scala?

val something = List(1,2,3)

List является абстрактным, и вы не можете создать его, вызвав new List(), но List(1,2,3) работает просто отлично.

Ответы [ 2 ]

16 голосов
/ 27 сентября 2011

Поскольку это вызов метода apply объекта-компаньона списка. В scala метод с именем apply может быть вызван с пропущенным именем метода (т.е. только с паренсом). Именно с помощью этого механизма работает последовательность и доступ к карте

Следовательно, List(1, 2, 3) на самом деле:

List.apply(1, 2, 3)

Итак, это вызов метода применения объекта List , реализация которого равна:

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

Итак, вы можете видеть, что apply - это метод, который принимает повторяющийся параметр (последовательность ) и вызывает метод toList для этой последовательности. Этот toList на Seq наследуется от TraversableOnce:

def toList: List[A] = new ListBuffer[A] ++= seq toList

Итак, вы можете видеть, что это создает список с помощью ListBuffer и ++= метода:

override def ++=(xs: TraversableOnce[A]): this.type =
  if (xs eq this) ++= (this take size) else super.++=(xs)

Это в конечном итоге получает реализацию ++= от Growable:

def ++=(xs: TraversableOnce[A]): this.type = { xs.seq foreach += ; this } 

Вызов new List() не работает, потому что List - это traitsealed один) - вам бы пришлось применять реализации для абстрактных методов. Тот факт, что он запечатан, означает, что он может быть реализован только классом из того же исходного файла.

11 голосов
/ 27 сентября 2011

List(1,2,3) - это «магический синтаксис» для вызова метода apply в объекте-компаньоне свойства или класса List.

...