더북(TheBook)

그러면 다음과 같이 에러가 나온다.

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라는 단어가 담긴 기본 메모리를 가리킨다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.