문자열에 대한 참조 대신 실제 문자열을 처리한다면 상황이 달라진다. 코드 2-8은 복합 타입인 String을 생성한다. 러스트 컴파일러는 이제 단일 소유권 원칙을 적용한다. 이전과 같이 y = x로 String을 재할당하면 소유권이 변수 x에서 y로 옮겨지게 된다.
소유권이 x에서 y로 옮겨졌기 때문에 x는 범위를 벗어나고, 러스트는 내부적으로 이를 uninit로 표시한다(https://doc.rust-lang.org/nomicon/drop-flags.html). 그림 2-7에서 이 개념을 나타내고 있다. 변수 x를 출력하려고 하면 소유권이 y로 옮겨졌기 때문에 x는 더 이상 존재하지 않으며 x에는 값이 없다.
▲ 그림 2-7 복잡한 타입을 새 변수에 재할당할 때 러스트는 포인터 정보를 복사하고 새 변수에 소유권을 부여한다. 기존의 것은 더 이상 필요하지 않으며 범위를 벗어난다