Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

Rust で配列の要素そのもので配列にアクセスしようとするとエラー

error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable

エラーが出たのでメモ。

やりたいこと。

fn main() {
    let mut v: Vec<usize> = vec![3, 123, 234, 345, 456, 567];
    v[v[0]] *= 100;   // 要素 3 を 100 倍する
    println!("{:?}", v);
}

起きたエラー。

error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable
--> src/main.rs:3:7
|
3 | v[v[0]] *= 100;
| --^----
| | |
| | immutable borrow occurs here
| mutable borrow occurs here
| mutable borrow later used here

For more information about this error, try `rustc --explain E0502`.
|

日本語意訳。
"v" はミュータブルとして借用されているので、イミュータブルとして借用できません。

いまひとつ理解に至らないが、v のベクタ自体がミュータブルな配列で、この再代入の式自体が mut の効果を持ち、添え字として取り出そうとした v[1] の部分がイミュータブルのアクセスとして取得しようとして、それで引っかかっている、ということか?

let (v1, v2) = (&mut v, &v); ってしたら同じように怒られるから、こんな感じか?

とりあえず別に束縛して暗黙コピーしたらちゃんと動いた。

let mut v: Vec<usize> = vec![3, 123, 234, 345, 456, 567];
let vv = v[0];
v[vv] *= 100;
println!("{:?}", v);
// [3, 123, 234, 34500, 456, 567]