Диапазоны в Rust не включают верхнюю границу (если вы не используете конструктор диапазона ..=
). Это означает, что диапазоны типа 2..2
имеют нулевую длину: «начинайте с 2 и берите каждый элемент до, но не включая 2». Когда длина равна 5
, 5..5
и 5..
эквивалентны.
Хотя кажется, что нет смысла начинать диапазон после последнего элемента, удобно, что это работает таким образом. Например, если вы брали когда-либо сокращающиеся диапазоны:
for i in 0 .. s.len() + 1 {
println!("slice = {:?}", &s[i ..]);
}
Выходы:
slice = "hello"
slice = "ello"
slice = "llo"
slice = "lo"
slice = "o"
slice = ""
Было бы неприятно, если бы вам пришлось обрабатывать последний, пустой срез, случай отдельно.
Но если пройти дальше длины данных , то вызовет панику. Нет причины, по которой вы намеренно написали бы s[6..6]
, если длина строки равна 5.