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)
会出错?
答案 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)