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