Объявление трейта в Rust
Набор методов объявляют отдельно от типов, которые его выполнят. В одном месте файла записывают имя трейта и сигнатуры действий: какие параметры принимает метод и что возвращает. Сами тела для конкретных структур появятся позже в другом блоке.
Опишем трейт приветствия с одним методом, который строит строку по значению:
trait Greet {
fn greet(&self) -> String;
}
struct User {
name: &'static str,
}
fn main() {
let user = User { name: "ann" };
println!("{}", user.name);
}
Здесь Greet пока только задает
форму метода greet. Структура
User существует сама по себе, пока
тип не начнет выполнять этот набор. Такой
порядок помогает сначала
договориться о действиях, а потом
распределить реализации по типам.
В одном трейте можно перечислить несколько методов, если сценарий требует больше одного шага:
trait Label {
fn title(&self) -> &'static str;
fn code(&self) -> i32;
}
struct Tag {
title: &'static str,
code: i32,
}
fn main() {
let tag = Tag { title: "ok", code: 1 };
println!("{}", tag.title);
}
Дана структура:
struct Book {
title: &'static str,
}
let book = Book { title: "rust" };
Объявите набор с методом, который по общей
ссылке возвращает поле title как
&'static str. Пока достаточно
описания без выполнения для Book.
Дана структура:
struct Point {
x: i32,
y: i32,
}
let point = Point { x: 3, y: 4 };
Запишите отдельное описание с двумя
методами: один возвращает x, другой
y. Тип пока не связывайте с этим
набором.
Дана структура:
struct Note {
text: &'static str,
}
let note = Note { text: "hi" };
Придумайте имя набора и объявите метод,
который возвращает String из поля
text. Выполнение для Note
оставьте на потом.