这个问题已经在这里有一个答案:
在这里我想实现:
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
,这取决于你拥有什么。