Re[17]: Ваше отношение к языку Scala
От: mkizub Литва http://symade.tigris.org
Дата: 09.06.07 18:04
Оценка: +1
Здравствуйте, aka50, Вы писали:

A>Здравствуйте, mkizub, Вы писали:


M>>Посмотри на код, генерируемый Scala и ужаснись.

A>Покажи... вот честно, интересно... а то пока только пугаешь (есть там конечно кривости, но как это сделать иначе я тоже не сильно представляю)

M>>Или вот, пусть мне нужны параметры типов в рантайме. Чтоб я мог написать

M>>List<String> ls = ...;
M>>String[] arr = ls.toArray();
M>>а не
M>>String[] arr = ls.toArray(new String[ls.size()]);

A>Вообще-то разработчику vm должно быть стыдно, если он не знает почему именно требуется объект массива


Устыди. Я не понял где мне стыдится. Я знаю, что он требуется в яве. А в моем комплиторе он не требуется.

A>на scala это решается безо всяких прыжков:


A>
scala>> val ls = 1 :: 2 :: Nil
A>ls: List[Int] = List(1, 2)

scala>> ls.toArray
A>unnamed1: Array[Int] = [I@4854f6 << обрати внимание, что тут именно нейтив массив, а не boxed
A>


A>Код в самой скала самый обычный:

A>
A>override def toArray[B >: A]: Array[B] = {
A>   val result = new Array[B](size)
A>   copyToArray(result, 0)
A>   result
A>}
A>


A>Другой вопрос, когда мы хотим что-то такое, но это уже спасибо блин erasure...

A>
A>class MyType[T] {
A>  def oops = new T()
A>}
A>


Я же сказал — в рантайме. А рантайме типы нужны. А ты опять про erasure.
Я не знаю, как в Scala сделан List[Int].toArray, но он не может этого делать
без инлайнинга или передачи спрятанных параметров в метод. Чудес не бывает.
Откуда-то метод toArray должен узнать тип массива. И поскольку в Scala эти
типы отрезаются компилятором — то только один из предложенных вариантов — хранить
в самом List (передача параметра во время создания списка) и передавать
параметр во время вызова toArray. Других вариантов просто нет.
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.