그러면 다음과 같이 에러가 나온다.
error[E0382]: borrow of moved value: `x` --> src/main.rs:5:20 | 2 | let x = String::from("hello"); | - move occurs because `x` has type `String`, which does not implement the `Copy` trait 3 | let y = x; | - value moved here 4 | 5 | println!("{}", x); | ^ value borrowed here after move |
에러가 왜 일어날까? 코드 2-7에서 &str 타입으로 새 변수를 만들었다. hello라는 값을 가지는 문자열 슬라이스(str)에 대한 참조(&)이다(https://doc.rust-lang.org/std/primitive.str.html). 이 변수를 새 변수에 할당(y = x)하면 동일한 메모리 주소의 새 포인터를 만든다. 이제 동일한 기본값을 가리키는 포인터가 두 개 생겼다.
그림 2-6에서 봤듯이 문자열 슬라이스는 생성된 후에는 값을 바꿀 수 없다. 즉, 불변(immutable)하다. 이제 두 변수를 모두 출력할 수 있고, 이 변수는 유효하며 hello라는 단어가 담긴 기본 메모리를 가리킨다.