Je to přesně tak, ale tady se střetávají tři věci:
1) pole má indexy prvků v rozsahu 0 až délka-1
2) array.len() vrací délku, takže prvek array[array.len()] už neexistuje
3) ALE současně range generuje hodnoty v rozsahu start <= x < end, takže "i" nikdy nebude rovno array.len()
Takže program:
fn main() { for i in 0..10 { print!("{} ", i); } }
Vypíše:
0 1 2 3 4 5 6 7 8 9
neboli bez desítky.
To je v pohodě :-) Zkusím potom napsat shrnutí - krátkej článek s ukázkami a odkazy na konkrétní kapitoly v seriálu.
Mimochodem, range takto funguje i v dalších jazycích, což je někdy fajn, někdy to trošku štve, ale zdá se to být dost konzistentní.
Python:
>>> range(0,10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Clojure:
user=> (range 0 10) (0 1 2 3 4 5 6 7 8 9) user=> (range 10) (0 1 2 3 4 5 6 7 8 9)
Ve vetsine programovacich jazyku se pouzivaji spis polootevrene intervaly, protoze se s nima lepe pracuje (viz tento priklad), a predejde se tak mj. i fencepost problemu. Priklad s Pythonim range() ktery generuje take polootevrene intervaly:
len(range(m)) == m
len(range(a, b)) == b - a
range(a, a) == []
range(a, b) + range(b, c) == range(a, c)