Индекс для своего типа в Rust
Скобки у своего типа опираются на стандартный
трейт индекса. Он позволяет вернуть ссылку
на элемент. Тип номера задают отдельно: для
списка в памяти часто берут usize,
как у среза и вектора. Номер должен попадать
в диапазон хранилища: плохой индекс
останавливает программу так же, как при
прямом обращении к элементу вектора вне длины.
Соберем структуру с вектором строк и опишем чтение по номеру:
struct Shelf {
items: Vec<String>,
}
impl std::ops::Index<usize> for Shelf {
type Output = String;
fn index(&self, i: usize) -> &String {
&self.items[i]
}
}
fn main() {
let shelf = Shelf {
items: vec![
String::from("a"),
String::from("b"),
],
};
let first = &shelf[0];
println!("{}", first);
}
Дана структура:
struct Row {
cells: Vec<i32>,
}
Сделайте чтение ячейки по usize
через скобки у Row, соберите
значение с тремя числами, выведите
среднее по индексу 1.
Дана структура:
struct Tags {
names: Vec<String>,
}
Оформите доступ к строке по номеру
у Tags, заполните два имени,
выведите второе через скобки.
Скажите, почему метод трейта индекса возвращает ссылку, а не копию строки из вектора.