views:

144

answers:

2

I just found out that there are such iterators in Java.
Does Scala have iterators with 'set' and 'remove' methods for iterating (and modifying) mutable collections like array?
If there is no such iterator then is there a good reason for that?

+5  A: 

Scala does not currently have such an iterator.

I suspect that it does not because

  • Such iterators are not general (i.e they are only usable with mutable collections) but consume namespace.

  • Because they can rapidly become confusing to think about in conjunction with lazy operations like takeWhile (Is it always obvious what x.takeWhile(_<5).add(5) should do? On the one hand, the order of operations seems like you should take first, and then add; but on the other, take is lazy while add can often be implemented immediately, so combining them this way would be dangerous naively.)

  • Such iterators are only a good idea algorithmically with a very specialized set of collections (basically only linked lists and trees; add and remove is foolish to use on arrays anyway, and it doesn't make much sense on sets).

  • When an intrinsic conflict arises between generality and speed, the Scala collections library typically favors generality. This sort of iterator makes you think about the collections in a more particular way (i.e. more closely tied to the underlying data structure). You could imagine a library that made different choices, but for a maximally useful (and still quite performant) library, the Scala collections library philosophy is probably the better way to go.

Rex Kerr
Very good arguments, thank you. I don't see a danger with takeWhile. It is like x = x+1. Maybe some collections should provide specialized iterators mixed from several traits? Or mebye some kind of reference should returned like here:http://stackoverflow.com/questions/2799128/how-to-get-ponter-reference-semantics-in-scala/2799208#2799208
Łukasz Lew
A: 

Thread on the same topic on comp.lang.scala.user

Łukasz Lew