在 Scala 中创建列表和集合:我实际上得到了什么?
如果我使用 Set(1, 2, 3)
在 Scala 中创建一个 Set
,我会得到一个 immutable.Set
。
scala> val s = Set(1, 2, 3)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
Q1:这到底是一个什么样的套装?它是一些哈希集吗?例如,查找的复杂性是多少?
问题2:在哪里可以阅读到这种“创建集合”的方法?我认为这是 apply
方法,但文档说“此方法允许将集合解释为谓词。它返回 true,当且仅当该集合包含元素 elem 时。”
类似,如果我使用 List(1, 2, 3)
创建一个 List
,我会得到
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 中,我可以在哪里阅读有关此“列表创建”方法的信息?
If I create a Set
in Scala using Set(1, 2, 3)
I get an immutable.Set
.
scala> val s = Set(1, 2, 3)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
Q1: What kind of Set is this actually? Is it some hash-set? What is the complexity of look-ups for instance?
Q2: Where can I read up on this "set-creating" method? I thought that it was the apply
method but the docs says "This method allows sets to be interpreted as predicates. It returns true, iff this set contains element elem."
Similarly, if I create a List
using List(1, 2, 3)
, I get
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: Again, what do I get? In this case I can't even immediately tell if it's mutable or not, since it's not even part of the scala.collection
-package. Why does this live in the scala
package?
Q4: Where in the API can I read about this "list-creating" method?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Q1:在这种特定情况下,您会得到一个
Set3
,它是一个由三个参数组成的不可变集合。据推测它使用 if-else if-else 来检查包含。如果您创建的元素超过 4 个,您将获得一个不可变的哈希集。Q2:你需要查看对象Set的
apply
方法,而不是类。 Set 类的apply
方法是在执行someSet(something)
时调用的方法。Q3: scala.:: 是一个非空不可变单链表(如果执行不带参数的
List()
操作,则会得到Nil
这是一个不可变空列表)。它位于 scala 包中,因为它被认为非常基本,因此属于基础包。Q4:参见 Q2。
Q1: In this specific case you get a
Set3
which is an immutable set of exactly three arguments. Presumably it uses if-else if-else to check inclusion. If you create a set of more than 4 elements, you get an immutable hash set.Q2: You need to look at the
apply
method of the object Set, not the class. Theapply
method of the Set class is what is called when you dosomeSet(something)
.Q3: scala.:: is a non-empty immutable singly linked list (if you do
List()
without arguments, you getNil
which is an immutable empty list). It lives in thescala
package because it is considered so basic that it belongs in the base package.Q4: See Q2.
只是为了补充 sepp2k 对第三季度的出色回答,他说
这适用于 Scala 2.7
在 Scala 2.8 中,集合类已被重新组织,现在
::
类位于scala.collection.immutable
中,名称为scala.::
是 scala.collection.immutable.:: 的类型别名。Just to add to sepp2k's excellent answer to Q3, where he says
This applies to Scala 2.7
In Scala 2.8, the collections classes have been reorganized, and now the
::
class lives inscala.collection.immutable
, and the namescala.::
is a type alias forscala.collection.immutable.::
.如果你调用 getClass 方法,
那是因为 scala.collection.immutable.List 是一个抽象类,它有两个实现:scala.Nil 类和 scala.:: 。在 Scala 中,:: 是一个有效的标识符,您可以使用它来命名一个类。 Nil 代表空列表,scala.:: 代表任何非空列表。
if you call getClass method on the
That’s because scala.collection.immutable.List is an abstract class, and it comes with two implementations: the scala.Nil class and scala.::. In Scala, :: is a valid identifier, and you could use it to name a class. Nil represents an empty list, and scala.:: represents any nonempty list.