任何避免重复代码的方法 mut 而不是结构内部的 mut 引用



这是我想要实现的:

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,具体取决于您拥有的内容。

相关内容

  • 没有找到相关文章