& 로 읽는 건 절반의 이야기야. 빌린 값을 바꾸려면 가변 참조가 필요해: &mut.
&mut — 빌려서 수정
&mut s 는 값을 바꿀 수 있는 참조를 빌려줘. 함수가 호출자의 데이터를 제자리에서 수정해 — 소유권 이전도, 반환도 필요 없어. 이게 허용되려면 값 자체가 mut 으로 선언돼야 해; 불변인 것에 가변 참조를 잡을 순 없어.
하나의 큰 제약
어느 순간이든 값에 대해 불변 참조를 몇 개든 OR 가변 참조를 정확히 하나 가질 수 있어 — 둘 다는 절대. &mut 가 존재하는 동안엔 그 값으로의 다른 참조 (가변이든 아니든) 가 공존 못 해. 처음엔 빡빡하게 느껴지고, 언어에서 가장 중요한 규칙 하나야.
Aliasing XOR mutation. 독자 여럿 또는 작성자 하나, 동시에는 절대. 이 규칙 하나가 컴파일 타임에 데이터 레이스를 없애 — 한 참조만 쓸 수 있고 그 쓰는 동안 아무도 읽지도 못하면, 두 스레드가 같은 데이터를 망칠 수 없어.
왜 이게 진짜 버그를 막냐면
리스트를 순회하는 동안 다른 게 그걸 수정하는 상황 — 많은 언어의 전형적 크래시 (iterator invalidation). Rust 에선 borrow checker 가 거부해: 순회가 참조를 들고 있으니 동시 &mut 는 컴파일 안 돼. 버그가 권장 안 되는 게 아니라 불가능해.