为什么val range = Range(1,2,3,4)给出错误?

时间:2012-03-17 07:00:38

标签: scala scala-collections

for (i <- Array.apply(1 to 4))
      print(i);

Range(1, 2, 3, 4)

Range(1, 10)

//res0: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

那么为什么val range = Range(1, 2, 3, 4)会出错?

2 个答案:

答案 0 :(得分:11)

Range是一种特殊的集合,它可以代表什么,以便有效地执行其操作。它只能表示一系列数字,在元素之间有固定的步骤。因此,只需要告知开始,结束和步长以便构建。另一个Array可以保存任意值,因此必须明确告知其构造函数这些值是什么。

Range.apply的定义是它需要:

  • 两个参数:范围的开始和结束,或
  • 三个参数:范围的开始,结束和步长。

以下是来自apply的{​​{1}}的定义:

scala.collection.immutable.Range

使用/** Make a range from `start` until `end` (exclusive) with given step value. * @note step != 0 */ def apply(start: Int, end: Int, step: Int): Range = new Range(start, end, step) /** Make an range from `start` to `end` inclusive with step value 1. */ def apply(start: Int, end: Int): Range = new Range(start, end, 1) apply进行约束,scala.Array接受可变长度参数T*

/** Creates an array with given elements.
 *
 *  @param xs the elements to put in the array
 *  @return an array containing all elements from xs.
 */
def apply[T: ClassManifest](xs: T*): Array[T] = {
  val array = new Array[T](xs.length)
  var i = 0
  for (x <- xs.iterator) { array(i) = x; i += 1 }
  array
}

如果您的目标是获得数字1到4的Array,请尝试以下操作:

(1 to 4).toArray

答案 1 :(得分:0)

那么,

scala> Array("abc") // an array containing a string
res0: Array[String] = Array(abc)

scala> Array(1) // an array containing a number
res1: Array[Int] = Array(1)

scala> Array(true) // an array containing a boolean
res2: Array[Boolean] = Array(true)

scala> Array(1 to 4) // an array containing a range
res3: Array[scala.collection.immutable.Range.Inclusive] = Array(Range(1, 2, 3, 4))

为什么它应该以其他方式运作?无论如何,这是你应该使用的:

scala> Array.range(1, 4)
res4: Array[Int] = Array(1, 2, 3)