我有一些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();
}
我应该采取更好的方式吗?或者也许是关于构造代码的一般方法的一些想法,以便我不需要这个新类型?
答案 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。