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

Tuple2的概念目的是什么?

  •  2
  • snerd  · 技术社区  · 11 年前

    将此作为后续 this SO question

    我刚接触scala 99 problems p9的给定溶液为:

    object P09 {
      def pack[A](ls: List[A]): List[List[A]] = {
        if (ls.isEmpty) List(List())
        else {
          val (packed, next) = ls span { _ == ls.head }
          if (next == Nil) List(packed)
          else packed :: pack(next)
        }
      }
    }
    

    这个 span function 正在这里做所有的工作。正如你从API文档(它是链接)中看到的那样,span返回Tuple2(实际上,文档中说它返回一对,但这已经被弃用,取而代之的是Tuple2)。我试图弄明白为什么你没有得到像列表之类的东西,然后偶然发现了上面的SO链接。据我所知,Tuple2的原因与提高性能有关,因为它不必处理Java将int之类的东西“装箱/拆箱”为Integers之类的对象。我的问题是

    1) 这是准确的说法吗?

    2) 像span这样的东西返回Tuple2还有其他原因吗?

    谢谢!

    2 回复  |  直到 9 年前
        1
  •  7
  •   mikołak    11 年前

    A. TupleN 与“标准”相比,对象至少有两个主要区别 List +:

    • (更不重要的是)元组的大小是事先知道的,这样可以更好地解释(程序员和编译器)。
    • (更重要的是)元组 保留类型信息 每个元素/“插槽”。

    注意,正如所暗示的 Tuple2 TupleN公司 家庭,都使用相同的概念。例如:

    scala> ("1",2,3l)
    res0: (String, Int, Long) = (1,2,3)
    
    scala> res0.getClass
    res1: Class[_ <: (String, Int, Long)] = class scala.Tuple3
    

    正如您在这里看到的,3元组中的每个元素都有一个不同的类型,允许更好的模式匹配、更严格的类型保护等。

    + 异构列表在Scala中也是可能的,但到目前为止,它们还不是标准库的一部分,而且很难理解,尤其是对于新手来说。

        2
  •  3
  •   sepp2k    11 年前

    span 只返回两个值。A. Tuple2 可以正好保存两个值。列表可以包含任意多个值。因此 图普勒2 比使用列表更合适。

    推荐文章