Компилятор способен предоставить основные реализации для некоторых типажей с помощью атрибута #[derive]. Эти типажи могут быть реализованы вручную, если необходимо более сложное поведение.
Ниже приводится список выводимых типажей:
• Типажи сравнения:Eq, PartialEq, Ord, PartialOrd
• Clone, для создания T из &T с помощью копии.
• Copy, чтобы создать тип семантикой копирования, вместо семантики перемещения.
• Hash, чтобы вычислить хеш из &T.
• Default, чтобы создать пустой экземпляр типа данных.
• Debug, чтобы отформатировать значение с помощью {:?}.
// `Centimeters`, кортежная структура, которую можно сравнить
#[derive(PartialEq, PartialOrd)]
struct Centimeters(f64);
// `Inches`, кортежная структура, которую можно напечатать
#[derive(Debug)]
struct Inches(i32);
impl Inches {
fn to_centimeters(&self) -> Centimeters {
let &Inches(inches) = self;
Centimeters(inches as f64 * 2.54)
}
}
// `Seconds`, кортежная структура без дополнительных атрибутов
struct Seconds(i32);
fn main() {
let _one_second = Seconds(1);
// Ошибка: `Seconds` не может быть напечатана; не реализован типаж `Debug`
//println!("Одна секунда выглядит как: {:?}", _one_second);
// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку
// Ошибка: `Seconds` нельзя сравнить; не реализован типаж `PartialEq`
//let _this_is_true = (_one_second == _one_second);
// ЗАДАНИЕ ^ Попробуйте раскомментировать эту строку
let foot = Inches(12);
println!("Один фут равен {:?}", foot);
let meter = Centimeters(100.0);
let cmp =
if foot.to_centimeters() < meter {
"меньше"
} else {
"больше"
};
println!("Один фут {} одного метра.", cmp);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX