Как да наричаме оператора ::
?
Demo
Copy
Clone
Eq
PartialEq
Ord
PartialOrd
Hash
Debug
Display
Default
trait Clone {
fn clone(&self) -> Self;
fn clone_from(&mut self, source: &Self) { ... }
}
#[derive(Clone)]
, ако всички полета имплементират Clone
clone
на всички полета рекурсивно
Clone
, защото не работим с гола памет!trait Copy: Clone { }
memcopy
Clone
#[derive(Copy)]
Можем да имплементираме Copy
само ако:
Copy
Drop
)pub trait Drop {
fn drop(&mut self);
}
std::mem::drop
за товаtrait Default {
fn default() -> Self;
}
#[derive(Default)]
, ако всички полета имплементират Default
Default
или fn new() -> Self
HashMap
и HashSet
#[derive(Hash)]
, ако всички полета имплементират Hash
struct MagicTrick {
description: String,
secrets: Vec<String>,
skills: Vec<String>
}
let trick = MagicTrick {
description: String::from("Изчезваща монета"),
secrets: vec![String::from("Монетата се прибира в ръкава")],
skills: vec![String::from("Бързи ръце"), String::from("Заблуда")]
};
println!("{}", trick);
println!("===");
println!("{:?}", trick);
Ще очакваме следния изход след като имплементираме Dispay
и Debug
за MagicTrick
Магически трик "Изчезваща монета" === Трик Описание: "Изчезваща монета" Тайни: ["Монетата се прибира в ръкава"] Умения: ["Бързи ръце", "Заблуда"]
Debug
{}
use std::fmt::{self, Display, Formatter};
impl Display for MagicTrick {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "Магически трик {:?}", self.description)
}
}
Нека да разбием примера и да видим какво oзначават новите неща
write!(f, "Магически трик {:?}", self.description)
print!
и format!
enum Result<T, E> {
Ok(T),
Err(E),
}
Option<T>
Ok(T)
или грешка с Err(E)
mod fmt { type Result = Result<(), fmt::Error> }
mod io { type Result<T> = Result<T, io::Error> }
let trick = MagicTrick {
description: String::from("Изчезваща монета"),
secrets: vec![String::from("Монетата се прибира в ръкава")],
skills: vec![String::from("Бързи ръце"), String::from("Заблуда")]
}
println!("{}", trick);
#[derive(Debug)]
имплементира версия по подразбиране
{:?}
use std::fmt::{self, Debug, Formatter};
impl Debug for MagicTrick {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write! {
f,
r#"
Трик
Описание: {:?}
Тайни {:?}
Умения {:?}
"#,
self.description,
self.secrets,
self.skills
}
}
}
let trick = MagicTrick {
description: String::from("Изчезваща монета"),
secrets: vec![String::from("Монетата се прибира в ръкава")],
skills: vec![String::from("Бързи ръце"), String::from("Заблуда")]
};
println!("{}", trick);
println!("===");
println!("{:?}", trick);
Операторите се дефинират с trait-ове
Видяхме trait-а Add
, с който дефинираме оператора +
trait Add<RHS = Self> {
type Output;
fn add(self, rhs: RHS) -> Self::Output;
}
Add
, Sub
, Mul
, Div
, Rem
BitAnd
, BitOr
, BitXor
, Shl
, Shr
*Assign
Neg
, Not
Index
IndexMut
Demo
trait PartialEq<Rhs = Self> where Rhs: ?Sized {
fn eq(&self, other: &Rhs) -> bool;
fn ne(&self, other: &Rhs) -> bool { ... }
}
==
и !=
a == a
да върне true
assert_eq!(f64::NAN == f64::NAN, false);
trait Eq: PartialEq<Self> { }
a == a
да е true
trait PartialOrd<Rhs = Self>: PartialEq<Rhs> where Rhs: ?Sized {
fn partial_cmp(&self, other: &Rhs) -> Option<Ordering>;
fn lt(&self, other: &Rhs) -> bool { ... }
fn le(&self, other: &Rhs) -> bool { ... }
fn gt(&self, other: &Rhs) -> bool { ... }
fn ge(&self, other: &Rhs) -> bool { ... }
}
enum Ordering {
Less,
Equal,
Greater,
}
Дефинира операторите <
<=
>
>=
PartialOrd
дефинира частична наредба
assert_eq!(f64::NAN < 0., false);
assert_eq!(f64::NAN >= 0., false);
trait Ord: Eq + PartialOrd<Self> {
fn cmp(&self, other: &Self) -> Ordering;
fn max(self, other: Self) -> Self { ... }
fn min(self, other: Self) -> Self { ... }
}
Дефинира тотална наредба