Почему val range = Range (1, 2, 3, 4) дает ошибку? - PullRequest
2 голосов
/ 17 марта 2012
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 ]

11 голосов
/ 17 марта 2012

A Range - это особый вид коллекции, ограниченный в том, что он может представлять для эффективного выполнения своих операций. Он может представлять только последовательность чисел с фиксированным шагом между элементами. Таким образом, для того, чтобы его можно было построить, нужно только указать начало, конец и размер шага. Array на другом может содержать произвольные значения, поэтому его конструктору должно быть явно указано, что это за значения.

Определение Range.apply состоит в том, что требуется либо:

  • два аргумента: начало и конец диапазона или
  • три аргумента: начало, конец и размер шага для диапазона.

Вот определения apply из 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
}

Если ваша цель - набрать Array из чисел от 1 до 4, попробуйте это:

(1 to 4).toArray
0 голосов
/ 22 марта 2012

Ну

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)
...