我可以创建一个既适用于值又适用于特征的借用引用的结构吗?
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
绑定。
我想制作一个结构来包装另一种类型,但可以采用实现给定特征的值的拥有和借用版本。
例如,假设我有特质 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
绑定。