【问题标题】:Creating lists and sets in Scala: What do I actually get?在 Scala 中创建列表和集合:我实际上得到了什么?
【发布时间】:2011-03-10 03:16:20
【问题描述】:

如果我使用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:这到底是个什么样的Set?它是一些哈希集吗?例如,查找的复杂性是多少?

Q2:我在哪里可以了解这种“集合创建”方法?我认为这是 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-package 的一部分。为什么它存在于scala 包中?

Q4:我可以在 API 的什么地方了解这种“创建列表”的方法?

【问题讨论】:

    标签: list scala set scala-collections


    【解决方案1】:

    Q1:在这种特定情况下,您会得到一个Set3,它是一个由三个参数组成的不可变集合。大概它使用 if-else if-else 来检查包含。如果你创建了一个超过 4 个元素的集合,你会得到一个不可变的哈希集。

    Q2:你需要查看对象Set的apply方法,而不是类。 Set 类的apply 方法是在您执行someSet(something) 时调用的。

    Q3:scala.:: 是一个非空的不可变单链表(如果你不带参数执行List(),你会得到Nil,这是一个不可变的空表)。它存在于scala 包中,因为它被认为非常基础,属于基础包。

    第四季度:见第二季度。

    【讨论】:

    • 啊,谢谢!您有您提到的Set-object 的链接吗? (我只能找到特质!)
    • @aiobe:Stackoverflow 不喜欢 URL 中的 $,所以我编辑为使用 tinyurl。
    • 哦,原来如此。想知道我怎么会错过。谢谢,你很有帮助:)
    【解决方案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 = scala.collection.immutable.$colon$colon$@6ce5d622
    

    【讨论】:

      【解决方案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
      

      那是因为 scala.collection.immutable.List 是一个抽象类,它有两个实现:scala.Nil 类和 scala.::。在 Scala 中,:: 是一个有效的标识符,你可以用它来命名一个类。 Nil 表示一个空列表,scala.:: 表示任何非空列表。

      【讨论】:

        猜你喜欢
        • 2021-03-22
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 2011-01-17
        • 2018-10-13
        • 2017-04-28
        • 1970-01-01
        相关资源
        最近更新 更多