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