She*_*ter 15 reference traits rust
如果我有一个特征,并且接受一个约束到该类型的泛型类型的函数,一切正常.如果我尝试传入对该类型的引用,我会收到编译错误.
trait Trait {
fn hello(&self) -> u32;
}
struct Struct(u32);
impl Trait for Struct {
fn hello(&self) -> u32 {
self.0
}
}
fn runner<T: Trait>(t: T) {
println!("{}", t.hello())
}
fn main() {
let s = Struct(42);
// Works
runner(s);
// Doesn't work
runner(&s);
}
Run Code Online (Sandbox Code Playgroud)
error[E0277]: the trait bound `&Struct: Trait` is not satisfied
--> src/main.rs:24:5
|
24 | runner(&s);
| ^^^^^^ the trait `Trait` is not implemented for `&Struct`
|
= help: the following implementations were found:
<Struct as Trait>
note: required by `runner`
--> src/main.rs:13:1
|
13 | fn runner<T: Trait>(t: T) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
我可以通过为实现特征的类型的任何引用实现特征来解决问题:
impl<'a, T> Trait for &'a T
where
T: Trait,
{
fn hello(&self) -> u32 {
(*self).hello()
}
}
Run Code Online (Sandbox Code Playgroud)
我遗失的那条信息是什么时候不应该实现这个?问另一种方式,为什么编译器不会自动为我实现这个?由于目前没有,我认为必须存在这种实施方式不利的情况.
什么时候不应该实现这个?问另一种方式,为什么编译器不会自动为我实现这个?由于目前没有,我认为必须存在这种实施方式不利的情况.
举个例子,这个Default
特质立即浮现在脑海中.
pub trait Default {
fn default() -> Self;
}
Run Code Online (Sandbox Code Playgroud)
我可以实现它T
,但没有办法自动实现它&T
.
您在此处编写的特定特征仅self
作为参考,这是可以编写您所做的附加实现的唯一原因。
出于这个原因,runner()
按值取参数可能是不可取的;你应该参考它。这个指导方针可以普遍适用:如果可以实现特征作为参考,那么而不是想知道“我应该实现它吗?” 你应该想知道“我为什么要实施它?” 对于您将使用它的唯一情况,应该首先更改为通过引用获取对象。