我什么时候不应该落实到性状的实现者参照的特质?

问题描述 投票:15回答:2

如果我有一个特点,那接受泛型类型受限于该类型的功能,一切工作正常。如果我尝试在该类型的引用来传递,我得到一个编译错误。

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);
}
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) {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^

我可以通过实施任何引用到实现性状的类型特征解决这个问题:

impl<'a, T> Trait for &'a T
where
    T: Trait,
{
    fn hello(&self) -> u32 {
        (*self).hello()
    }
}

这件作品的我就是缺少信息是当我不应该实现这个?问另一种方式,为什么不编译器自动实现这个给我吗?由于它目前没有,我想一定有情况下,有这种实现是不利的。

reference rust traits
2个回答
3
投票

你写这里的特定性状只需要self参照,那就是它可以写​​出你做的额外实施的唯一原因。

为此,取参数按值runner()可能是不可取;你应该改为通过引用服用。该指南可普遍适用:如果是可以实现的参考特征,然后,而不是想你应该想:“为什么我会实现它?”为唯一的情况下,你会用它或许应该“我要实现它?”来改变通过首先参考拍摄物体。


5
投票

当我不应该实现这个?问另一种方式,为什么不编译器自动实现这个给我吗?由于它目前没有,我想一定有情况下,有这种实现是不利的。

作为一个例子,Default特质立即浮现在脑海。

pub trait Default {
    fn default() -> Self;
}

我可以实现它T,但也没有办法自动执行它&T

© www.soinside.com 2019 - 2024. All rights reserved.