7.5.1.3 pointers/ref

포인터를 위해서는, 역구조화와 역참조를 구분하여 사용할 필요가 있다. 이들은 C에서 사용되는 것과는 다른 개념이다.

  • 역참조는 * 사용.
  • 역구조화는 &, ref, 그리고 ref mut
fn main() {
    // 타입 `i32`의 참조를 할당. `&`는 참조가 할당될 것을 선언한다.
    let reference = &4;

    match reference {
        // 만약 `reference`가 `&val`에 대해 패턴 매치 시키게 되면, 
        // 그 결과는 `&i32`와 비교하는 것과 같다.
        // 우리가 살펴볼 것은 만약 매칭되면 `&`이 드랍되어, 
        // `i32`가 `val`로 할당되게 된다는 점이다. 
        &val => println!("Got a value via destructuring: {:?}", val),
    }

    // `&`를 생략하고 싶으면, 매칭시키기 전에 역참조하라. 
    match *reference {
        val => println!("Got a value via dereferencing: {:?}", 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!("Got a reference to a value: {:?}", r),
    }

    // `ref mut`의 사용도 유사하다.
    match mut_value {
        ref mut m => {
            // 참조를 얻었다. 이를 역참조하여 여기에 어떤 값이든 더할 수 있다.
            *m += 10;
            println!("We added 10. `mut_value`: {:?}", m);
        },
    }
}

results matching ""

    No results matching ""