Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpAsIt 41 of 288 menu
◀ ▶

Свой тип элемента в 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.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить