这是我想要实现的:
trait Foo {
fn readonly(&self) -> i32;
fn modify(&mut self, val: i32);
}
struct FooWrapper<'a> {
foo: &'a Foo,
}
impl<'a> FooWrapper<'a> {
fn readonly(&self) -> i32 {
self.foo.readonly()
}
fn modify(&mut self, val: i32) {
self.foo.modify(val);//!!!
}
}
作为输入,我得到了&Foo
和&mut Foo
,例如: fn func(a: &Foo, b: &mut Foo)
.
我想然后将它们包装在FooWraper
内,并使用它的方法与Foo
合作.
但正如您所看到的,编译器不允许标有 //!!!
的代码。
无需代码重复即可解决此问题的任何方法,例如:
struct FooWrapper<'a> {
foo: &'a Foo,
}
struct FooWrapperMut<'a> {
foo: &'a mut Foo,
}
impl<'a> FooWrapper<'a>..
impl<'a> FooWrapperMut<'a>..
?
只需将foo
设为可变引用即可。然后可以可变或不可变地借用它。
struct FooWrapper<'a> {
foo: &'a mut Foo,
}
&mut T
引用始终可以强制到&T
。
如果你想为不可变引用提供最少的功能,如果你能够获得一个可变的引用,你可以用类型参数把它分开:
trait Foo {
fn readonly(&self) -> i32;
fn modify(&mut self, val: i32);
}
struct FooWrapper<T> {
foo: T,
}
impl <'a> FooWrapper<&'a Foo> {
fn readonly(&self) -> i32 {
self.foo.readonly()
}
}
impl <'a> FooWrapper<&'a mut Foo> {
fn modify(&mut self, val: i32) {
self.foo.modify(val); //
}
}
现在,您可以提供类型参数为&mut Foo
或仅&Foo
,具体取决于您拥有的内容。