일단 rust 결론은 가변 참조중에는 원본 수정이 불가능하다.
c언어에서 저렇게 하면 무한루프에 빠져서 결국 메모리 오류가 날것같은데
rust 라는 언어는 알아서 컴파일 타임에 체크를 해준다.
이 코드는 컴파일 타임에 에러가 발생합니다. 그 이유는 Rust의 엄격한 빌림(Borrowing) 규칙 때문입니다.
let mut v = vec![1, 2, 3, 4, 5];
for i in &mut v {
v.push(6);
*i += 50;
}
&mut v는 v에 대한 가변 참조를 만들어 for 루프에서 사용하고 있습니다.for i in &mut v 구문은 내부적으로 v.iter_mut()를 호출하며, v를 순회하는 동안 가변 참조가 유지됩니다.v.push(6)을 호출함으로써, v를 직접 수정하려고 합니다.Rust는 같은 시점에 가변 참조가 존재하면 원본에 직접 접근하는 것을 허용하지 않습니다.
즉, &mut v를 통해 v를 순회하고 있으므로 v는 이미 빌려진 상태입니다. 그런데 그 와중에 v.push(6)으로 v를 다시 직접 변경하려 하므로 다음과 같은 컴파일 에러가 발생합니다:
error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable
v는 가변 참조 상태(&mut v) 이며,v.push(6)처럼 직접 수정(가변 빌림) 하려고 하면 Rust가 이를 안전하지 않다고 판단하여 컴파일 에러를 발생시킵니다.v를 순회하면서 동시에 수정하려면, 값을 복사하거나, 수정 후 따로 반복하는 방식으로 바꿔야 합니다:
let mut v = vec![1, 2, 3, 4, 5];
let copy = v.clone(); // 또는 v.to_vec()
for _ in © {
v.push(6);
}
push:let mut v = vec![1, 2, 3, 4, 5];
let len = v.len();
for i in 0..len {
v[i] += 50;
v.push(6); // 안전하게 반복 범위 외부에서 push
}
필요하시다면 이 코드를 안전하게 바꾸는 목적(예: 성능, 구조)도 함께 도와드릴 수 있습니다.