4 impl std
::ops
::Deref
for X
{
6 fn deref(&self) -> &i32 { &self.val }
10 trait M { fn m(self); }
11 impl M
for i32 { fn m(self) { println!("i32::m()"); }
}
12 impl M
for X { fn m(self) { println!("X::m()"); }
}
13 impl<'a
> M
for &'a X { fn m(self) { println!("&X::m()"); }
}
14 impl<'a
, 'b
> M
for &'a
&'b X { fn m(self) { println!("&&X::m()"); }
}
15 impl<'a
, 'b
, 'c
> M
for &'a
&'b
&'c X { fn m(self) { println!("&&&X::m()"); }
}
17 trait RefM { fn refm(&self); }
18 impl RefM
for i32 { fn refm(&self) { println!("i32::refm()"); }
}
19 impl RefM
for X { fn refm(&self) { println!("X::refm()"); }
}
20 impl<'a
> RefM
for &'a X { fn refm(&self) { println!("&X::refm()"); }
}
21 impl<'a
, 'b
> RefM
for &'a
&'b X { fn refm(&self) { println!("&&X::refm()"); }
}
22 impl<'a
, 'b
, 'c
> RefM
for &'a
&'b
&'c X { fn refm(&self) { println!("&&&X::refm()"); }
}
25 impl std
::ops
::Deref
for Y
{
27 fn deref(&self) -> &i32 { &self.val }
31 impl std
::ops
::Deref
for Z
{
33 fn deref(&self) -> &Y { &self.val }
37 impl std
::marker
::Copy
for A {}
38 impl Clone
for A { fn clone(&self) -> Self { *self }
}
39 impl M
for A { fn m(self) { println!("A::m()"); }
}
40 impl<'a
, 'b
, 'c
> M
for &'a
&'b
&'c A { fn m(self) { println!("&&&A::m()"); }
}
41 impl RefM
for A { fn refm(&self) { println!("A::refm()"); }
}
42 impl<'a
, 'b
, 'c
> RefM
for &'a
&'b
&'c A { fn refm(&self) { println!("&&&A::refm()"); }
}
45 // I'll use @ to denote left side of the dot operator
46 (*X{val:42}
).m(); // i32::refm() , self == @
47 X{val:42}
.m(); // X::m() , self == @
48 (&X{val:42}
).m(); // &X::m() , self == @
49 (&&X{val:42}
).m(); // &&X::m() , self == @
50 (&&&X{val:42}
).m(); // &&&X:m() , self == @
51 (&&&&X{val:42}
).m(); // &&&X::m() , self == *@
52 (&&&&&X{val:42}
).m(); // &&&X::m() , self == **@
54 (*X{val:42}
).refm(); // i32::refm() , self == @
55 X{val:42}
.refm(); // X::refm() , self == @
56 (&X{val:42}
).refm(); // X::refm() , self == *@
57 (&&X{val:42}
).refm(); // &X::refm() , self == *@
58 (&&&X{val:42}
).refm(); // &&X::refm() , self == *@
59 (&&&&X{val:42}
).refm(); // &&&X::refm(), self == *@
60 (&&&&&X{val:42}
).refm(); // &&&X::refm(), self == **@
62 Y{val:42}
.refm(); // i32::refm() , self == *@
63 Z{val:Y{val:42}
}.refm(); // i32::refm() , self == **@
65 A
.m(); // A::m() , self == @
66 // without the Copy trait, (&A).m() would be a compilation error:
67 // cannot move out of borrowed content
68 (&A
).m(); // A::m() , self == *@
69 (&&A
).m(); // &&&A::m() , self == &@
70 (&&&A
).m(); // &&&A::m() , self == @
71 A
.refm(); // A::refm() , self == @
72 (&A
).refm(); // A::refm() , self == *@
73 (&&A
).refm(); // A::refm() , self == **@
74 (&&&A
).refm(); // &&&A::refm(), self == @