Создание списков и наборов в Scala: что я на самом деле получаю? - PullRequest
12 голосов
/ 30 июня 2010

Если я создаю Set в Scala, используя Set(1, 2, 3), я получаю immutable.Set.

scala> val s = Set(1, 2, 3)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

Q1: Что это за набор на самом деле? Это какой-то хэш-набор? Например, какова сложность поиска?

Q2: Где я могу прочитать об этом методе "создания множества"? Я думал, что это был метод apply, но в документах говорится " Этот метод позволяет интерпретировать наборы как предикаты. Он возвращает истину, если этот набор содержит элемент elem. "


Аналогично, если я создаю List с использованием List(1, 2, 3), я получаю

scala> val l = List(1, 2, 3)
l: List[Int] = List(1, 2, 3)

scala> l.getClass
res13: java.lang.Class[_] = class scala.$colon$colon

Q3: Опять же, что я получу? В этом случае я даже не могу сразу сказать, является ли он изменяемым или нет, поскольку он даже не входит в пакет scala.collection. Почему это живет в пакете scala?

Q4: Где в API можно прочитать об этом методе "создания списка"?

Ответы [ 3 ]

22 голосов
/ 30 июня 2010

Q1: В этом конкретном случае вы получите Set3, который является неизменным набором ровно трех аргументов. Предположительно он использует if-else if-else для проверки включения. Если вы создаете набор из более чем 4 элементов, вы получаете неизменный хэш-набор.

Q2: вам нужно взглянуть на apply метод объекта Set, а не на класс. Метод apply класса Set - это то, что вызывается, когда вы делаете someSet(something).

Q3: scala. :: - это непустой неизменяемый односвязный список (если вы делаете List() без аргументов, вы получаете Nil, который является неизменным пустым списком). Он находится в пакете scala, поскольку считается настолько базовым, что входит в базовый пакет.

Q4: см. Q2.

12 голосов
/ 30 июня 2010

Просто добавлю к отличному ответу sepp2k на Q3, где он говорит

Он живет в пакете scala, потому что это считается настолько основным, что это принадлежит в базовой комплектации.

Это относится к Scala 2.7

В Scala 2.8 классы коллекций были реорганизованы, и теперь класс :: живет в scala.collection.immutable, а имя scala.:: является псевдонимом типа для scala.collection.immutable.::.

Welcome to Scala version 2.8.0.RC5 (OpenJDK 64-Bit Server VM, Java 1.6.0_18).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val l = List(1, 2, 3)
l: List[Int] = List(1, 2, 3)

scala> l.getClass
res0: java.lang.Class[_] = class scala.collection.immutable.$colon$colon

scala> scala.::
res1: collection.immutable.::.type = scala.collection.immutable.$colon$colon$@6ce5d622
1 голос
/ 27 марта 2014

если вы вызываете метод getClass на

scala> val list = List(1,2,3,45)
list: List[Int] = List(1, 2, 3, 45)

scala> val seq = Seq(1,2,3,4,5)
seq: Seq[Int] = List(1, 2, 3, 4, 5)

scala> list.getClass
res13: Class[_ <: List[Int]] = class scala.collection.immutable.$colon$colon

scala> seq.getClass
res14: Class[_ <: Seq[Int]] = class scala.collection.immutable.$colon$colon

Это потому, что scala.collection.immutable.List является абстрактным классом и имеет две реализации: класс scala.Nil и scala. ::. В Scala :: является допустимым идентификатором, и вы можете использовать его для именования класса. Nil представляет пустой список, а scala. :: представляет любой непустой список.

...