也许这是一个简单的问题,但我不能理解为什么只是为原始的,拥有的类型导入Trait,我得到了免费的引用类型相同的impl…
trait Cool: Sized + std::fmt::Debug {
fn cool(self) {
println!("cool -> {:?}", self);
}
}
impl Cool for i32 {}
// it still works if this line is uncommented...
// impl Cool for &i32 {}
fn main(){
let val = 123;
val.cool();
(&val).cool();
}
游乐场
这不仅仅是因为原语,它将适用于所有实现Copy
的类型。否则不起作用:
trait Cool: Sized + std::fmt::Debug {
fn cool(self) {
println!("cool -> {:?}", self);
}
}
#[derive(Debug)]
struct NonCopy;
impl Cool for i32 {}
impl Cool for NonCopy {}
fn main(){
let val = 123;
val.cool();
(&val).cool();
let nc = NonCopy{};
nc.cool();
(&nc).cool();
}
失败,并有一个明确的错误代码:
error[E0507]: cannot move out of a shared reference
--> src/main.rs:20:5
|
20 | (&nc).cool();
| ^^^^^^------
| | |
| | value moved due to this method call
| move occurs because value has type `NonCopy`, which does not implement the `Copy` trait
|
游乐场
它所发生的是,使用Copy类型rust在需要时为您透明地创建一个副本。
注意,即使我们注释掉前一行// nc.cool();
,它也会失败,这显然会移动值…
这是自动解引用;它适用于任何时候使用.
操作符。这是为了消除在C和相关语言中存在的.
和->
之间的区别。
在RFC 241中被引入。