The main usage is in for
construction.
for i in [10..25].step(10) do assert i == 10 or i == 20
But step
is usable as any kind of iterator.
assert [10..27].step(5).to_a == [10,15,20,25]
If step == 1
, then it is equivalent to the default iterator
.
assert [1..5].step(1).to_a == [1..5].to_a
If step
is negative, then the iterator will iterate on ranges whose first
> last
.
assert [25..12].step(-5).to_a == [25,20,15]
On such ranges, the default iterator
will be empty
assert [5..1].step(1).to_a.is_empty
assert [5..1].iterator.to_a.is_empty
assert [5..1].to_a.is_empty
assert [5..1].is_empty
Note that on non-empty range, iterating with a negative step will be empty
assert [1..5].step(-1).to_a.is_empty
# Gets an iterator that progress with a given step.
#
# The main usage is in `for` construction.
#
# ~~~
# for i in [10..25].step(10) do assert i == 10 or i == 20
# ~~~
#
# But `step` is usable as any kind of iterator.
#
# ~~~
# assert [10..27].step(5).to_a == [10,15,20,25]
# ~~~
#
# If `step == 1`, then it is equivalent to the default `iterator`.
#
# ~~~
# assert [1..5].step(1).to_a == [1..5].to_a
# ~~~
#
# If `step` is negative, then the iterator will iterate on ranges whose `first` > `last`.
#
# ~~~
# assert [25..12].step(-5).to_a == [25,20,15]
# ~~~
#
# On such ranges, the default `iterator` will be empty
#
# ~~~
# assert [5..1].step(1).to_a.is_empty
# assert [5..1].iterator.to_a.is_empty
# assert [5..1].to_a.is_empty
# assert [5..1].is_empty
# ~~~
#
# Note that on non-empty range, iterating with a negative step will be empty
#
# ~~~
# assert [1..5].step(-1).to_a.is_empty
# ~~~
fun step(step: Int): Iterator[E]
do
var i
if step >= 0 then
i = iterator
else
i = new DowntoIteratorRange[E](self)
step = -step
end
if step == 1 then return i
return i.to_step(step)
end
lib/core/collection/range.nit:136,2--188,4