2010-05-10 2 views
6

I just выяснил, что на Java есть такие итераторы.
Имеет ли в Scala итераторы методы 'set' и 'remove' для Итерирование (и изменение) изменяемых коллекций, таких как массив?
Если такого итератора нет, тогда есть ли веская причина для этого?Итераторы для изменчивых коллекций в Scala?

+0

Вы должны скопировать (или перефразировать) ответ (ы) вы получили в списке рассылки здесь (для потомков). –

+0

@ Randall. Хорошо, я дал ссылку, чтобы максимизировать полезность. –

ответ

6

У Scala в настоящее время нет такого имени.

Я подозреваю, что это не потому, что

  • Такие итераторы не являются общими (т.е. они использоваться только с изменяемыми коллекциями), но потребляют пространство имен.

  • Потому что они могут быстро стать запутанными думать о том, в сочетании с ленивыми операциями, как takeWhile (всегда ли это очевидно, что x.takeWhile(_<5).add(5) должен делать? С одной стороны, порядок операций кажется, что вы должны принять, а затем добавить но с другой стороны, take ленив, а add часто может быть реализован немедленно, так комбинируя их таким образом было бы опасно наивность)

  • таких итераторы только хорошая идея алгоритмически с очень специализированным набором коллекций (в основном. только связанные списки и деревья, добавление и удаление глупо использовать на массивах в любом случае, и это не имеет особого смысла в наборах).

  • Когда внутренний конфликт возникает из-за общности и скорости, библиотека коллекций Scala, как правило, предпочитает общность. Этот тип итератора заставляет вас думать о коллекциях более определенным образом (т. Е. Более тесно привязан к базовой структуре данных). Вы могли бы представить себе библиотеку, которая сделала разные варианты, но для максимально полезной (и все еще довольно эффективной) библиотеки, возможно, лучше всего подходит философия библиотеки коллекций Scala.

+0

Очень хорошие аргументы, спасибо. Я не вижу опасности с takeWhile. Это как x = x + 1. Может быть, некоторые коллекции должны предоставлять специализированные итераторы, смешанные с несколькими чертами? Или, может быть, какая-то ссылка должна вернулась, как здесь: http://stackoverflow.com/questions/2799128/how-to-get-ponter-reference-semantics-in-scala/2799208#2799208 –