かなり臭いことがわかったRustコードがいくつかあります。構造体のフィールドから同時に可変参照を取得したいのですが、もちろんRustは同時に複数の可変参照を許可していません。
私が現在行っているのは、基本的に新しいタイプのタプルを作成し、2つの異なるタイプを別々の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の借用分析は、互いに素なフィールドの借用をネイティブにサポートします。
タプルのようなものstruct
または通常のいずれかを使用でき、struct
すべてが正常に機能します。
struct Foo;
impl Foo {
fn foo(&mut self, bar: &mut Bar) {
bar.bar();
}
}
struct Bar;
impl Bar {
fn bar(&mut self) {
println!("bar")
}
}
struct Tupled(Foo, Bar);
impl Tupled {
fn foobar(&mut self) {
self.0.foo(&mut self.1);
}
}
struct Named {
foo: Foo,
bar: Bar,
}
impl Named {
fn foobar(&mut self) {
self.foo.foo(&mut self.bar);
}
}
fn main() {
let mut tupled = Tupled(Foo, Bar);
tupled.foobar();
let mut named = Named{ foo: Foo, bar: Bar };
named.foobar();
}
これはコンパイルされ、プレイグラウンドで実行されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加