Почему срез, начинающийся с длины строки, не паникует? - PullRequest
0 голосов
/ 27 августа 2018
fn main() {
    let s = String::from("hello");
    let hello = &s[5..];
    println!("{}", hello);
}

Почему этот код работает без паники? Я думаю, что это условие, когда индекс выходит за рамки размера контента. Вывод этого примера кода ничего не показывает.

1 Ответ

0 голосов
/ 27 августа 2018

Диапазоны в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...