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

Ограничение типа трейтом в Rust

Имя типа ограничивают трейтом, и внутри доступны его методы. В списке параметров типа после имени ставят двоеточие и имя набора. Тогда функция принимает ссылку на любое значение, которое выполняет этот набор, без записи impl в параметре.

Выведем приветствие через обобщенную функцию с ограничением:

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: Greet>(item: &T) { 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: Greet>(item: &T) -> String { 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 Score { points: i32, } let score = Score { points: 40 };

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

Скажите, чем запись с именем типа и трейтом отличается от параметра с impl в сигнатуре.

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