代码之家  ›  专栏  ›  技术社区  ›  aioobe

在Scala中创建列表和集合:我实际得到了什么?

  •  12
  • aioobe  · 技术社区  · 15 年前

    如果我创建一个 Set Set(1, 2, 3) 我收到一封信 immutable.Set

    scala> val s = Set(1, 2, 3)
    s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
    

    问题1: 这到底是什么样的一套?是什么杂凑集吗?例如,查找的复杂性是什么?

    问题2: 我在哪里可以读到这个“集合创建”方法?我以为是 apply 但医生说 "


    同样,如果我创建一个 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
    

    问题3: 再说一遍,我得到了什么?在这种情况下,我甚至不能立即判断它是可变的还是不可变的,因为它甚至不是系统的一部分 scala.collection -包装。为什么它生活在 scala 包裹?

    问题4: 我在API的什么地方可以看到这个“列表创建”方法?

    3 回复  |  直到 15 年前
        1
  •  22
  •   Daniel C. Sobral    15 年前

    Set3 它是由三个参数组成的不可变集合。假设它使用if-else来检查包含。如果创建一个包含4个以上元素的集合,则会得到一个不可变的哈希集。

    apply 方法,而不是类。这个 应用 Set类的方法是执行此操作时调用的方法 someSet(something)

    scala.:: List() 没有争论,你就会 Nil scala 因为它被认为是基本的,所以它属于基本包。

    问题4:见问题2。

        2
  •  12
  •   Ken Bloom    15 年前

    只是为了补充sepp2k对Q3的出色回答,他说

    scala 打包原因 它被认为是如此基本 属于基本包。

    这适用于Scala 2.7

    在Scala2.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
  •  1
  •   anish    12 年前

    如果在

    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.::表示任何非空列表。

    推荐文章