2014-09-06 2 views
0

У меня есть список Scala, для которых я выводим следующую пару выходов (Scala 2,10):Scala GetClass размышлений

println(myList.getClass)` 
// class scala.collection.immutable.$colon$colon 

println(myList) 
// List(1, 2, 3,....) 

Не могли бы вы объяснить:

  1. Что такое значение $ colon $ colon

  2. Почему не вывод, полученный из getClass, указывает, что это список, а не только некоторая коллекция?

+0

@ gabriele, в то время как намерение хорошее, ваше редактирование этого вопроса не очень хорошо - посмотрите на неудобную нумерацию внутри созданных вами пулей. также почему дополнительный backtick? ... можете ли вы исправить или пересмотреть по своему вкусу? – matanster

+0

нормально исправлено, мое плохое. –

ответ

2

Во-первых, $colon$colon является кодирование в JVM-дружественные (но не человек дружественный) класса ::. Напомним, что пустым списком является singleton Nil и что непустым списком является :: (read «cons») с головой (которая является элементом) и хвостом (который снова является списком). Таким образом, непустой список всегда является экземпляром этого класса ::. Но компилятор переименовывает его в $colon$colon для JVM, чтобы быть счастливым.

Я не уверен, что понимаю ваш второй вопрос. Выходной сигнал println(myList) просто перенаправляет на метод toString() из List, который (через несколько других направлений) печатает строку "List", за которой следуют элементы в круглых скобках. Это все.

+0

Получил! почему downvote? – matanster

+0

Действительно ли это важно в дизайне языка, чтобы сохранить два байта и вызвать этот класс '::', а не то, что программист пишет, чтобы использовать его - '' List'', и использовать другой тип '' Nil'' для пустой список? – matanster