Создание списков и наборов в 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, если этот набор содержит элемент Элем. "





Аналогично, если я создам 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 я могу прочитать об этом методе "создания списков"?

580   3  

3 ответов:

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

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

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

Q4: См. Q2.

Просто чтобы добавить к превосходному ответу 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

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

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

Comments

    Ничего не найдено.