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

Если я создаю a 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, эквивалентность, этот набор содержит элемент элемента".


Точно так же, если я создаю a 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 я могу читать об этом "создающем список" методе?

12
задан Eugene Yokota 15 December 2010 в 22:37
поделиться

2 ответа

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

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

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

Q4: См. Q2.

22
ответ дан 2 December 2019 в 04:16
поделиться

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

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

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

В Scala 2.8 классы коллекций были реорганизованы, и теперь класс :: живет в scala.collection.immutable , а name 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
12
ответ дан 2 December 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: