Iterator method naming, usually
each_<object>, doesn’t make it obvious that an iterator will be returned.
Even worse, we can confuse them with the block-yielding variants, for example
<object>_iterator, or if too long,
iter_<object>, for methods returning an
Iterator, instead of
each_*, which is widely used for methods yielding a block.
How do you confuse yielding methods with non-yielding ones?
Both methods iterate over each element of the collection. They’re just two variants of the same behaviour. One just iterates immediately, the other detached.
Sharing the same general behaviour concludes using the same name.
Sometimes I did just have
"abc".each_char after removing the block, and was confused why it can even be compiled, because a block was missing.
Then I realized that
each_* methods are not only a convention for methods yielding a block, but also for iterators.
It would be better to make it obvious directly in the name that it is an iterator.
Also, being able to do
"abc".each_char.each is even weirder.
Ruby has this convention where an iterator without a block returns an
Enumerator object. What’s really cool about this is being able to chain iterators, which I think would be a future goal in crystal as well. (Can crystal do any iterator chaining at all yet?)
It works the same way in Crystal. The difference is that Ruby can’t chain Iterator methods but Crystal can.
Care to provide an example?
Or maybe explain what you mean by chaining.