Создание списков и наборов в 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 я могу прочитать об этом методе создания списка?
Ответы
Ответ 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.:: представляет любой непустой список.