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); }, } }