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

Ограничение отдельной записью в Rust

Длинное ограничение пишут после списка параметров отдельным словом. Сначала объявляют имена типов без требований в круглых скобках, а затем перечисляют, какой трейт должен выполнить каждый тип. Смысл совпадает с записью через двоеточие в угловых скобках.

Перепишем функцию приветствия с отдельным блоком ограничений:

trait Greet { fn greet(&self) -> String; } struct User { name: &'static str, } impl Greet for User { fn greet(&self) -> String { format!("hello, {}", self.name) } } struct Bot { id: i32, } impl Greet for Bot { fn greet(&self) -> String { format!("bot {}", self.id) } } fn show<T>(item: &T) where T: Greet, { let line = item.greet(); println!("{}", line); } fn main() { let user = User { name: "ann" }; let bot = Bot { id: 2 }; show(&user); show(&bot); }

Тот же прием удобен, когда функция возвращает строку:

trait Greet { fn greet(&self) -> String; } struct User { name: &'static str, } impl Greet for User { fn greet(&self) -> String { format!("hello, {}", self.name) } } fn line_for<T>(item: &T) -> String where T: Greet, { item.greet() } fn main() { let user = User { name: "leo" }; let text = line_for(&user); println!("{}", text); }

Дана структура:

struct Cat { name: &'static str, } let cat = Cat { name: "neo" };

Выполните набор приветствия для Cat и запишите функцию с отдельным блоком ограничений, которая печатает greet. Передайте cat по ссылке.

Дана структура:

struct Tag { label: &'static str, } let tag = Tag { label: "go" };

Сделайте набор с методом, который возвращает label, и функцию с вынесенным ограничением, отдающую строку подписи. Выведите ее.

Скажите, когда удобнее держать ограничение рядом с именем типа, а когда выносить его отдельным блоком.

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