Почему определение Array.map в Scala является «выбросить новую ошибку ()» - PullRequest
9 голосов
/ 21 мая 2010

Исходный код map для Массив :

override def map[B](f: A => B): Array[B] = throw new Error()

Но работает следующее:

val name : Array[String]= new Array(1)
name(0)="Oscar"
val x = name.map {  ( s: String ) => s.toUpperCase }
// returns: x: Array[java.lang.String] = Array(OSCAR)

Ответы [ 2 ]

15 голосов
/ 22 мая 2010

Как правило, когда вы видите throw new Error() в исходном коде библиотечного класса, он представляет собой точку, где компилятор вмешивается и реализует метод, соединяясь со средством платформы (помните, что это может быть Java или .NET ).

* SID Array объясняет, как обрабатывать массивы в Scala 2.7.x, и как они изменились в 2.8. Компилятор, используемый для магического преобразования объекта в BoxedArray, если вы вызвали map.

В 2.8 интеграция массивов в инфраструктуру коллекций Scala в значительной степени осуществляется с использованием обычных функций языка - неявных преобразований из Array[T] в WrappedArray[T] или ArraySeq[T], в зависимости от контекста, и неявных параметров типа Manifest[T] для поддержки создания массивов универсального типа T. Массив , индексирование , длина и update по-прежнему отображаются как throw new Error(). Array#map больше не существует, вместо этого вы найдете это в WrappedArray и ArraySeq как обычный метод.

UPDATE

Если вам интересно узнать, как определяется магия этого компилятора, взгляните на Scala 2.8 воплощение Cleanup.scala .

4 голосов
/ 22 мая 2010

Похоже, это просто фиктивный код, так как массивы Scala действительно являются Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...