Традиционные циклы for неуклюжи, многословны и подвержены ошибкам.Я думаю, это является достаточным доказательством того, что циклы «для каждого» добавляются в Java, C # и C ++, но если вы хотите получить более подробную информацию, вы можете проверить пункт 46 Effective Java .
Теперь циклы for-each по-прежнему намного быстрее, чем Scala для понимания, но они также гораздо менее мощны (и более неуклюжи), поскольку не могут возвращать значения.Если вы хотите преобразовать или отфильтровать коллекцию (или сделать обе для группы коллекций), вам все равно придется обрабатывать все механические детали построения коллекции результатов в дополнение для вычисления значений.Не говоря уже о том, что в нем неизбежно используется изменяемое состояние.
Наконец, хотя циклы for-each достаточно для коллекций, они не подходят для других монадических классов (из которых коллекции являются подмножеством).
Итак, у Scala есть общий метод, который заботится обо всем вышеперечисленном.Да, это медленнее, но цель состоит в том, чтобы компилятор эффективно оптимизировал его достаточно хорошо, чтобы это не стало помехой (и, конечно, JIT может помочь и здесь).
Этого не было достигнуто к этой дате, но -optimise
значительно сократил границы между общими циклами для каждого и для понимания в последних версиях Scala.Если производительность важна, вы всегда можете использовать while
или хвостовую рекурсию.
Теперь было бы возможно для Scala, чтобы иметь общие для циклов или для каждого цикла как особые случаи специальнонацелены на проблемы с производительностью (так как для понимания может делать все, что они делают).Однако это нарушает два принципа, которыми руководствуется Scala:
Уменьшите сложность.Да, вопреки тому, что некоторые говорят, что является целью проектирования, а особые случаи, которые не служат никакой другой цели, кроме оптимизации производительности - даже если существует работоспособное решение для случаев производительности - без необходимости увеличивают сложностьязыка.
Масштабируемость.Это в том смысле, что использование может масштабировать язык для любого размера проблемы путем написания библиотек.Дело в том, что если бы компилятор оптимизировал один конкретный класс, такой как Range
, для пользователя было бы невозможно создать замещающий класс, который бы работал так же хорошо.