如果我使用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
方法,但文档说“此方法允许将集合解释为谓词。如果此集合包含元素elem,则返回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
包中?
问题4:我可以在API中阅读有关此“创建列表”方法的内容吗?
答案 0 :(得分:22)
Q1:在这种特定情况下,你会得到一个Set3
,这是一组完全由三个参数组成的不可变集合。据推测,它使用if-else if-else来检查包含。如果创建一组超过4个元素,则会得到一个不可变的哈希集。
Q2:你需要查看对象集的apply
方法,而不是类。执行apply
时,调用Set类的someSet(something)
方法。
问题3:scala.::是一个非空的不可变单链表(如果你没有参数List()
,你会得到Nil
这是一个不可变的空列表)。它位于scala
包中,因为它被认为是基本的,它属于基础包。
问题4:见Q2。
答案 1 :(得分:12)
只是为了增加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
答案 2 :(得分:1)
如果你在
上调用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
这是因为scala.collection.immutable.List是一个抽象类,它带有两个实现:scala.Nil类和scala。::。在Scala中,::是一个有效的标识符,您可以使用它来命名一个类。 Nil表示空列表,scala。::表示任何非空列表。