私は2つの構造体を持っていVec
ます。もう一方を変更しながら、一方を反復できるようにしたい。プログラムの例を次に示します。
use std::slice;
struct S {
a: Vec<i32>,
b: Vec<i32>
}
impl S {
fn a_iter<'a>(&'a self) -> slice::Iter<i32> {
self.a.iter()
}
fn a_push(&mut self, val: i32) {
self.a.push(val);
}
fn b_push(&mut self, val: i32) {
self.b.push(val);
}
}
fn main() {
let mut s = S { a: Vec::new(), b: Vec::new() };
s.a_push(1);
s.a_push(2);
s.a_push(3);
for a_val in s.a_iter() {
s.b_push(a_val*2);
}
}
しかし、次のコンパイラ エラーがあります。
$ rustc iterexample.rs
iterexample.rs:28:9: 28:10 error: cannot borrow `s` as mutable because it is also borrowed as immutable
iterexample.rs:28 s.b_push(a_val*2);
^
note: in expansion of for loop expansion
iterexample.rs:26:5: 29:6 note: expansion site
iterexample.rs:26:18: 26:19 note: previous borrow of `s` occurs here; the immutable borrow prevents subsequent moves or mutable borrows of `s` until the borrow ends
iterexample.rs:26 for a_val in s.a_iter() {
^
note: in expansion of for loop expansion
iterexample.rs:26:5: 29:6 note: expansion site
iterexample.rs:29:6: 29:6 note: previous borrow ends here
iterexample.rs:26 for a_val in s.a_iter() {
iterexample.rs:27 println!("Looking at {}", a_val);
iterexample.rs:28 s.b_push(a_val*2);
iterexample.rs:29 }
^
note: in expansion of for loop expansion
iterexample.rs:26:5: 29:6 note: expansion site
error: aborting due to previous error
コンパイラが不平を言っていることを理解しています。self
私はまだそれをループしているので、for ループで借用しました。
概念的には、これを行う方法があるはずです。を変更しているだけs.b
で、ループしているもの ( s.a
) は変更していません。この分離を実証し、この種のプログラムをコンパイルできるようにするプログラムを作成する方法はありますか?
これは大規模なプログラムの単純化された例であるため、一般的な構造を同じに保つ必要があります (1 つが繰り返され、もう 1 つが更新されるいくつかのものを持つ構造体)。