Итераторы для изменяемых коллекций в Scala?

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


person Łukasz Lew    schedule 10.05.2010    source источник
comment
Вы должны скопировать (или перефразировать) ответы, которые вы получили в списке рассылки здесь (для потомков).   -  person Randall Schulz    schedule 10.05.2010
comment
@ Рэндалл. Ок, я дал ссылку для максимальной полезности.   -  person Łukasz Lew    schedule 11.05.2010


Ответы (2)


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

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

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

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

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

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

person Rex Kerr    schedule 10.05.2010
comment
Очень хорошие аргументы, спасибо. Я не вижу опасности в takeWhile. Это как х = х+1. Может быть, некоторые коллекции должны предоставлять специализированные итераторы, смешанные из нескольких трейтов? Или, может быть, какая-то ссылка должна быть возвращена, как здесь: «как получить справочную семантику ponter в scala»> stackoverflow.com/questions/2799128/ - person Łukasz Lew; 11.05.2010

Тема на ту же тему на comp.lang.scala.user

person Łukasz Lew    schedule 11.05.2010