Indexing is opaque
https://www.reddit.com/r/rust/comments/ddd7qm/comment/f2ftp47/?utm_source=share&utm_medium=web2x&context=3
Indexing is an arbitrary computation, which means it's opaque to the compiler and thus borrows the entire structure to perform the operation.
다음 코드는 컴파일이 안된다.
let v: Vec<String> = vec![
String::from("Hello"),
String::from("World")
];
let mut s_ref = &mut v[0];
let mut s_ref1 = &mut v[1]; // ERROR cannot borrow `v` as mutable more than once at a time
v[0]
라고 해서 v의 첫번째 원소에 대한 레퍼런스만을 빌려왔겠다고 생각하기 쉽지만, 러스트 컴파일러는 그 내부에 대해 잘 모르기 때문에 v
를 통째로 빌렸다고 생각하게 된다. 따라서 두번째 borrowing에서 컴파일러는 "엥? v를 또 가변레퍼런스로 빌려가게?" 하면서 오류를 뱉어내게 되는 것이다.
해결방법#
- perform your operations sequentially
split_at_mut
함수 사용하여 소유권을 따로 빌리기iter_mut
함수를 사용하여 각 원소에 대한 소유권을 빌려오기