任何方式,以避免重复码内结构的mut不MUT参考? [重复]

问题描述 投票:0回答:1

在这里我想实现:

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>..

?

reference rust mutability
1个回答
2
投票

只是让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,这取决于你拥有什么。

© www.soinside.com 2019 - 2024. All rights reserved.