Я только обнаружил, что в Java есть такие итераторы.
Есть ли в Scala итераторы с методами 'set' и 'remove' для итерации (и изменения) изменяемых коллекций, таких как массив?
Если такого итератора нет, то есть ли для этого веская причина?
Итераторы для изменяемых коллекций в Scala?
Ответы (2)
В настоящее время в Scala нет такого итератора.
Подозреваю, что не потому,
Такие итераторы не являются общими (т. е. их можно использовать только с изменяемыми коллекциями), но потребляют пространство имен.
Потому что они могут быстро сбивать с толку в сочетании с ленивыми операциями, такими как
takeWhile
(Всегда ли очевидно, что должна делатьx.takeWhile(_<5).add(5)
? С одной стороны, порядок операций кажется таким, что вы должны сначала взять, а затем добавить; но с другой стороны ,take
ленивы, аadd
часто можно реализовать сразу, поэтому объединение их таким образом было бы наивно опасным.)Такие итераторы являются хорошей идеей только с алгоритмической точки зрения с очень специализированным набором коллекций (в основном только связанные списки и деревья; добавление и удаление в любом случае глупо использовать для массивов, и это не имеет особого смысла для наборов).
Когда возникает внутренний конфликт между универсальностью и скоростью, библиотека коллекций Scala обычно отдает предпочтение универсальности. Итераторы такого типа заставляют вас думать о коллекциях более конкретным образом (т. е. более тесно связаны с базовой структурой данных). Вы можете представить себе библиотеку, которая делает разные выборы, но для максимально полезной (и при этом достаточно производительной) библиотеки философия библиотеки коллекций Scala, вероятно, лучший путь.