1

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]

使用实现: _*

4

2 回答 2

2

您正在使用伴随对象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)
于 2013-11-04T09:43:34.457 回答
1

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

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

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

于 2013-11-04T09:48:00.360 回答