Свой тип элемента в Rust
Когда у контейнера разные типы хранимых
значений, в описании трейта оставляют
имя связанного типа, а методы ссылаются
на него через Self::. Выполнитель
один раз указывает, чем именно будет
этот тип для его данных.
Опишем набор с первым элементом и полкой со строками:
trait Container {
type Item;
fn first(&self) -> Option<&Self::Item>;
}
struct Shelf {
labels: Vec<String>,
}
impl Container for Shelf {
type Item = String;
fn first(&self) -> Option<&Self::Item> {
self.labels.first()
}
}
fn main() {
let shelf = Shelf {
labels: vec![String::from("a"), String::from("b")],
};
match shelf.first() {
Some(label) => println!("{}", label),
None => println!("empty"),
}
}
На экране "a". Для Shelf связанный
тип это String, поэтому метод возвращает
ссылку на строку. Другой тип мог бы выбрать
i32 или свой struct, не меняя сигнатуру
в описании Container.
Тот же прием с коротким списком чисел:
trait Container {
type Item;
fn first(&self) -> Option<&Self::Item>;
}
struct Row {
values: Vec<i32>,
}
impl Container for Row {
type Item = i32;
fn first(&self) -> Option<&Self::Item> {
self.values.first()
}
}
fn main() {
let row = Row {
values: vec![10, 20],
};
if let Some(n) = row.first() {
println!("{}", n);
}
}
Дана структура:
struct Pack {
tags: Vec<String>,
}
Объявите набор с связанным типом элемента
и методом, который возвращает ссылку на
первую метку или пустой вариант. Выполните
его для Pack со строками и выведите
первую метку, если она есть.
Дан следующий код:
struct Bin {
codes: Vec<i32>,
}
Придумайте имя трейта с ассоциированным
типом и методом первого числа. Подставьте
i32 в блоке выполнения и выведите
первое значение из среза codes.
Дан следующий код:
struct Note {
text: String,
}
Скажите, где в блоке выполнения трейта
нужно указать связанный тип, если метод
должен вернуть &String из поля
text.