的原语和引用的 impl Trait



也许这是一个简单的问题,但我不能理解为什么只是为原始的,拥有的类型导入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中被引入。

最新更新