Рассмотрим следующий фрагмент кода:Scala: Список Массивы
val mapOfArrays = (0 to 10).map{
Array(1, 2)
}
Я ожидал, что выход будет типа List[Array[Int]]
, но это не так. Есть идеи?
Рассмотрим следующий фрагмент кода:Scala: Список Массивы
val mapOfArrays = (0 to 10).map{
Array(1, 2)
}
Я ожидал, что выход будет типа List[Array[Int]]
, но это не так. Есть идеи?
карта вызов ожидает функции в качестве параметра, но вы передаете массив из двух значений. Затем он попытается вызвать применение этого массива с каждым элементом диапазона.
Я считаю, что это то, что вы намеревались.
val mapOfArrays = (0 to 10).map(item => Array(1,2))
Массив * является * a 'Function1 [Int, T]' (точнее: 'Seq' является' PartialFunction [Int, T] ') от его индексов до его значений, поэтому код OP« работает », в первую очередь. –
Запуск его в РЕПЛ показывает, что на самом деле вызывает исключение:
scala> val mapOfArrays = (0 to 10).map{
| Array(1, 2)
| }
java.lang.ArrayIndexOutOfBoundsException: 2
at scala.collection.mutable.WrappedArray$ofInt.apply$mcII$sp(WrappedArray.scala:155)
at scala.collection.mutable.WrappedArray$ofInt.apply(WrappedArray.scala:155)
at scala.collection.mutable.WrappedArray$ofInt.apply(WrappedArray.scala:152)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
at scala.collection.immutable.Range.foreach(Range.scala:166)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:245)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
... 37 elided
Это потому, что код эквивалентен:
val mapOfArrays = (0 to 10).map{
Array(1, 2).apply
}
или более многословным
val mapOfArrays = (0 to 10).map{ x =>
Array(1, 2).apply(x)
}
который действительно является IndexedSeq[Int]
.
Метод .apply
от Array
возвращает элемент по данному индексу, который бросает ArrayIndexOutOfBoundsException
когда x
(от (0 to 10)
) reachs 2.
Изменение кода так, чтобы он не сгенерирует исключение:
scala> val mapOfArrays = (0 to 3).map{ Array(1, 2, 3, 4, 5) }
mapOfArrays: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4)
Я предполагаю, что вы хотели, чтобы написать вместо этого:
scala> val mapOfArrays = (0 to 10).map{ x =>
Array(1, 2)
}
mapOfArrays: scala.collection.immutable.IndexedSeq[Array[Int]] = Vector(Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2), Array(1, 2))
Вы можете написать это как 'List.fill (11) (Array (1,2))'. –