Подтвердить что ты не робот

Создание списков и наборов в Scala: что я на самом деле получаю?

Если я создаю 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, но в документах сказано: "Этот метод позволяет интерпретировать префиксы как предикаты. Он возвращает true, если этот набор содержит элемент 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 я могу прочитать об этом методе создания списка?

4b9b3361

Ответ 1

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

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

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

Q4: см. Q2.

Ответ 2

Просто чтобы добавить к 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 = [email protected]

Ответ 3

если вы вызываете метод 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

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