이 예를 자세히 살펴보자. 먼저, 새 변수는 기본으로 읽기 전용이며, 이를 변경하려면 새 변수를 만들 때 let 키워드에 mut를 추가해야 한다. 그런 다음 방금 만든 String 객체에 우편 번호를 추가하는 add_postal_code 함수를 호출한다.
add_postal_code 함수에 address를 전달하면 소유권이 add_postal_code 함수로 이동한다. 이 줄 뒤에 address를 출력하려면 코드 2-8과 같은 소유권 관련 에러가 발생한다. add_postal_code 함수는 (매개변수의 mut 키워드로) 변경할 수 있는 String 객체를 예상하고 .push_str 함수로 새 문자열을 추가한다. 그런 다음 변수 a에 다시 할당하여 업데이트된 String을 반환한다.
새 변수에 이름을 새로 지정하는 대신 이전과 정확히 동일한 이름인 address를 사용할 수도 있다. 이를 변수 섀도잉(variable shadowing, http://mng.bz/p6ZG)이라고 하며, 러스트의 기능이다. 변수 섀도잉을 사용하면 수정하려는 변수의 이름을 새롭게 계속 찾을 필요가 없다.
코드 2-10은 러스트 코드에서 더 자주 볼 수 있는 조금 다른 방식이다. address 값을 전달하고 소유권을 잃는 대신 참조를 전달한다. 따라서 소유권을 유지하고 필요할 때만 함수에 소유권을 빌려준다.