2016-10-31 3 views
2

구조체를 이동시키지 않고 일치 시키려면 참조를 사용하여 일치 작업을 수행하고 싶습니다. 그래서 다음 코드는 작업을 수행합니다참조를 사용하여 구조체를 일치 시키십시오.

struct Foo(i32); 

fn main() { 
    let x = Foo(1); 
    match &x { 
     ref a => println!("hello"), 
    } 
    println!("{}", x.0); 
} 

을하지만 난 다음 코드는 실제로 참조 (ref a)와 구조체 (x를) 일치하는 작동 찾을 수 당황 스럽네요. 하지만, 형식이 일치하지 않아야합니까?

struct Foo(i32); 

fn main() { 
    let x = Foo(1); 
    match x { 
     ref a => println!("hello") 
    } 
    println!("{}", x.0); 
} 
+1

'ref'는 '참조를 취함'을 의미합니다. 유형이 아닙니다. – WiSaGaN

+1

이 블로그 게시물보기 http://xion.io/post/code/rust-patterns-ref.html. 'ref'와'&'에 대해 알아야 할 것이 전부입니다. – aSpex

+0

감사합니다. 매우 도움이됩니다! – enaJ

답변

9

ref는 값에서 무언가 "를 벗겨"는 패턴의 정상적인 부분 아니지만 mut 같이 바인딩 이름의 수정이다. 값 대신 값에 대한 참조에 직접 바인드하도록 이름에 지시합니다.

의이 a 각각의 경우에이 유형을 보자 :

let() = a;
match &x { 
    ref a => { 
     let() = a; 
    } 
} 
match x { 
    ref b => { 
     let() = b; 
    } 
} 

a의 유형을 찾을 수있는 트릭입니다. 그리고 실제로 컴파일러는 우리에게 알려줍니다 :

| 
7 |    let() = a; 
    |     ^^ expected &&Foo, found() 

[...] 
    | 
12 |    let() = b; 
    |     ^^ expected &Foo, found() 

그래서 첫 번째 경우에, 우리는 즉 &&Foo, 참조에 대한 참조를 가지고있다. 이는 표현식 &x (유형 : &Foo)과 일치하고 컴파일러에게 "참조로"이름을 바인딩하도록 알려주기 때문입니다.

관련 문제