我可以翻译为:我能否创建一个结构体,既可以使用值,也可以使用对特质的借用引用?

5
我希望创建一个结构体,它能够封装另一个类型,并且可以接受实现了指定 trait 的拥有和借用版本的值。
例如,假设我有一个 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 的实现者。但是这是否是你应该这样做的方式呢?

1个回答

7

是的,如果您可以支持它,您的解决方案可能是很好的。 Iterator 与之执行相同的操作。

impl<'a, I> Iterator for &'a mut I where I: Iterator + ?Sized

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


“?Sized”是因为如果你通过引用获取目标,那么目标是否具有大小并不重要。 - Emil Eriksson
默认情况下,所有的边界都有一个隐式的“Sized”属性,这可以防止使用不定长类型。然而,如果您只通过间接方式使用边界(例如&TBox<T>),那么这是不希望的,?Sized将移除此限制。 - Veedrac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接