fn main() {
let mut s1 = Struct {};
s1.print_ref();
s1.print_mut_ref();
s1.print_self();
println!("----------------");
let r1 = &mut Struct {};
r1.print_ref();
r1.print_mut_ref();
r1.print_self();
println!("----------------");
let r2 = &Struct {};
r2.print_ref();
// r2.print_mut_ref();
r2.print_self();
println!("----------------");
let mut r3 = &Struct {};
r3.print_ref();
r3.print_mut_ref();
r3.print_self();
r3 = &Struct {};
}
trait Trait {
fn print_self(self);
fn print_ref(&self);
fn print_mut_ref(&mut self);
}
#[derive(Debug)]
struct Struct {}
impl Trait for Struct {
fn print_self(self) {
println!("Struct self");
}
fn print_ref(&self) {
println!("Struct &self")
}
fn print_mut_ref(&mut self) {
println!("Struct $mut self");
}
}
impl Trait for &Struct {
fn print_mut_ref(&mut self) {
println!("$Struct &mut self");
}
fn print_ref(&self) {
println!("$Struct &self");
}
fn print_self(self) {
println!("$Struct self");
}
}
impl Trait for &mut Struct {
fn print_self(self) {
println!("$mut Struct self");
}
fn print_ref(&self) {
println!("$mut Struct &self");
}
fn print_mut_ref(&mut self) {
println!("$mut Struct &mut self");
}
}
the answer is
Struct &self
Struct $mut self
Struct self
----------------
$mut Struct &self
Struct $mut self
$mut Struct self
----------------
Struct &self
$Struct self
----------------
Struct &self
$Struct &mut self
$Struct self