2016-10-31 14 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見てみましょう:

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

let() = a;aの種類を見つけるためのトリックです。そして、実際にコンパイラが教えてくれる:

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

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

だから最初のケースでは、我々はすなわち &&Foo、参照の参照を持っています。これは、式 &x(タイプ: &Foo)と一致しているため、コンパイラに "参照で"名前をバインドするように指示するためです。

関連する問題