Другим типом данных, который не забирает во владение данные является срез.
Давайте рассмотрим одну проблему, нам нужно создать функцию в которую мы передаем строку, а она возвращает нам первое слово, а если программа не находит пробелы, то возвращает эту же строку.
fn first_word(s: &String) -> usize {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
}
s.len() }
Для того чтобы найти пробел, мы превращаем s в массив байт с помощью метода as_bytes(), далее мы сравниваем каждый байт с байтом пробела, если это будет байт пробела то возвратим индекс этого пробела. если пробел не найдется то будет возвращена длина строки.
метод iter() создает итератор по массиву байт, а метод enumarate возвращает каждый элемент упакованный в кортеж.
Далее пишем
fn main() {
let mut s = String::from("hello world");
let word = first_word(&s);
s.clear();
}
Строковые срезы
Строковый срез - это ссылка на часть строки String.
примеры:
fn main() {
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
}
Во внутреннем представлении, срез хранит начальную позицию и длину среза, которая соответствует числу ending_index минус starting_index.