【问题标题】:How is type conversion achieved using : _*?如何使用 : _* 实现类型转换?
【发布时间】:2013-11-04 09:14:42
【问题描述】:

val t = Vector(1 to 3: _*)
返回:

scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)

val t = Vector(1 to 3)

返回:

scala.collection.immutable.Vector[scala.collection.immutable.Range.Inclusive] = Vector(Range(1, 2, 3))

类型转换是如何从 scala.collection.immutable.Vector[scala.collection.immutable.Range.Inclusive]

 scala.collection.immutable.Vector[Int]

使用: _*实现

【问题讨论】:

    标签: scala


    【解决方案1】:

    您正在使用companion object for Vector,即apply[A](elems: A*): Vector[A] 方法。

    如您所见,apply 将可变参数作为参数,因此:

    val vec = Vector(1 to 3: _*)
    

    将范围(这是一个序列)扩展为可变参数,最终的工作效率与键入相同:

    val vec = Vector(1, 2, 3)
    

    此时:

    val rangeVec = Vector(1 to 3)
    

    不扩大范围。这意味着 整个范围 被视为可变参数中的参数之一。所以可以这样做:

    scala> val rangeVec = Vector(1 to 3, 6 to 10)
    rangeVec: scala.collection.immutable.Vector[scala.collection.immutable.Range.Inclusive] = Vector(Range(1, 2, 3), Range(6, 7, 8, 9, 10))
    

    拥有一个范围向量。

    有趣的事实:如果你想从范围向量中展平范围,这很容易:

    scala> rangeVec.flatten
    res4: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 6, 7, 8, 9, 10)
    

    【讨论】:

    【解决方案2】:

    1 to 3 创建一个范围对象。

    所以Vector(1 to 3) 创建了一个范围对象的向量,而不是一个 int 的向量。

    _* 将范围内的元素扩展为可变参数,因此它会生成您需要的向量。

    【讨论】:

      猜你喜欢
      • 2017-09-24
      • 1970-01-01
      • 2020-09-13
      • 2019-07-16
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多