是否有更好的方法来获取不相交的struct字段的可变引用?

时间:2015-12-22 07:54:23

标签: rust

我有一些Rust代码,我发现它非常臭。我想同时从struct的字段中获取可变引用,但当然Rust不允许同时有多个可变引用。

我目前所做的基本上是制作元组的新类型,然后将两种不同类型的模式匹配为单独的ref mut模式。并不是这种方式在实践中的巨大粉丝。

struct Foo;

impl Foo {
    fn foo(&mut self, bar: &mut Bar) {
        bar.bar();
    }
}

struct Bar;

impl Bar {
    fn bar(&mut self) {
        println!("bar")
    }
}

struct FooBar((Foo, Bar));

impl FooBar {
    fn foobar(&mut self) {
        let &mut FooBar((ref mut foo, ref mut bar)) = self;
        foo.foo(bar);
        println!("foobar");
    }
}

fn main() {
    let mut foobar = FooBar((Foo, Bar));
    foobar.foobar();
}

Rust Playground

我应该采取更好的方式吗?或者也许是关于构造代码的一般方法的一些想法,以便我不需要这个新类型?

2 个答案:

答案 0 :(得分:4)

你不需要newtype a元组,你可以直接创建一个元组结构:

struct FooBar(Foo, Bar);

然后你可以非常简洁地编写代码

fn foobar(&mut self) {
    self.0.foo(&mut self.1);
    println!("foobar");
}

使用元组索引而不是let绑定。

答案 1 :(得分:3)

Rust的借用分析本身支持借用不相交的字段。

您可以使用类似元组的actions/SupportActionsSpec.js或常规的struct,这一切都可以正常运行:

struct

这会编译并运行in the playground