Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

포인터/ref

포인터의 경우, 구조 분해(destructuring)와 역참조(dereferencing)를 구분해야 합니다. 이들은 C/C++와 같은 언어와는 다르게 사용되는 서로 다른 개념이기 때문입니다.

  • 역참조는 *를 사용합니다
  • 구조 분해는 &, ref, ref mut을 사용합니다
fn main() {
    // `i32` 타입의 참조를 할당합니다. `&`는 참조가 할당되고 있음을 나타냅니다.
    let reference = &4;

    match reference {
        // 만약 `reference`를 `&val`에 대해 패턴 매칭하면, 다음과 같은 비교 결과가 됩니다:
// `&i32`
// `&val`
// ^ 매칭되는 `&`들을 떼어내면, `i32`가 `val`에 할당되어야 함을 알 수 있습니다.
        &val => println!("구조 분해를 통해 값을 얻었습니다: {:?}", val),
    }

    // `&`를 피하려면, 매칭하기 전에 역참조를 수행합니다.
    match *reference {
        val => println!("역참조를 통해 값을 얻었습니다: {:?}", val),
    }

    // 참조로 시작하지 않는다면 어떨까요? `reference`는 오른쪽이 이미
// 참조였기 때문에 `&`였습니다. 이것은 오른쪽이 참조가 아니기 때문에
// 참조가 아닙니다.
    let _not_a_reference = 3;

    // Rust는 정확히 이 목적을 위해 `ref`를 제공합니다. 이는 할당 방식을
// 수정하여 요소에 대한 참조가 생성되도록 하며, 이 참조가 할당됩니다.
    let ref _is_a_reference = 3;

    // 따라서, 참조가 없는 두 값을 정의함으로써, `ref`와 `ref mut`를 통해 참조를 가져올 수 있습니다.
    let value = 5;
    let mut mut_value = 6;

    // 참조를 생성하려면 `ref` 키워드를 사용합니다.
    match value {
        ref r => println!("값에 대한 참조를 얻었습니다: {:?}", r),
    }

    // `ref mut`도 비슷하게 사용합니다.
    match mut_value {
        ref mut m => {
            // 참조를 얻었습니다. 여기에 무언가를 더하기 전에
// 역참조를 해야 합니다.
            *m += 10;
            println!("10을 더했습니다. `mut_value`: {:?}", m);
        },
    }
}

참고:

ref 패턴