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