我可以创建一个既适用于值又适用于特征的借用引用的结构吗?

Can I make a struct that works with both values and borrowed references to a trait?

我想制作一个结构来包装另一种类型,但可以采用实现给定特征的值的拥有和借用版本。

例如,假设我有特质 Foobar:

trait Foobar {
    fn foobar(&self);
}

我现在想创建一个结构来包装这个特征的值或借用的引用:

struct FoobarWrapper<T: Foobar> {
    wrapped: T,
    extra_stuff: Stuff
}

在这里,我希望 FoobarWrapper 与 Baz&Baz 一起工作,因为 impl Foobar for Baz.

我想出了一个可能有效的解决方案,但我不知道它是否符合惯用,那就是简单地做:

impl<'a, T: Foobar> Foobar for &'a T  {
    fn foobar(&self) {
        (*self).foobar()
    }
}

如果我没记错的话,这对实现 Foobar 的值也是 Foobar 的实现者的任何引用。但这是你应该做的方式吗?

是的,如果您支持的话,您的解决方案可能很好。 Iterator

做同样的事情
impl<'a, I> Iterator for &'a mut I where I: Iterator + ?Sized

为了灵活性,您可能还应该添加 ?Sized 绑定。