2016-11-27 20 views
0

私はいくつかの要求をするためにハイパーライブラリを使用しようとしています。 Headers::get()メソッドはOption<&H>を返します。Hは1つのフィールドを持つタプル構造体です。私はif let Some()を使ってOptionを分解することができます。しかし、我々はどのように&Hを破壊するのですか?確かに私はいつも.0でフィールドにアクセスすることができましたが、Rustにこれを行う構文があるのは不思議です。タプル構造体を参照で分解する方法

あなたがこれをコンパイルしようとすると、錆コンパイラは素敵なメッセージとエラーを修正する方法を教えてくれます
struct s(String); 

fn f(input: &s) -> &s { 
    input 
} 

fn main() { 
    let my_struct1 = s("a".to_owned()); 
    let s(foo) = my_struct1; 
    let my_struct2 = s("b".to_owned()); 
    let &s(bar) = f(&my_struct2); // this does not work 
    let baz = &my_struct2.0; // this works 
} 

答えて

3

error[E0507]: cannot move out of borrowed content 
    --> <anon>:11:9 
    | 
11 |  let &s(bar) = f(&my_struct2); // this does not work 
    |   ^^^---^ 
    |   | | 
    |   | hint: to prevent move, use `ref bar` or `ref mut bar` 
    |   cannot move out of borrowed content 

これは、あなただけの参照をしたいコンパイラに伝えるために必要とされます構造体のフィールドに渡します。デフォルトマッチングは移動を実行し、元の構造体の値はもはや有効ではなくなります。

はのは、例を修正しましょう:

struct s(String); 

fn f(input: &s) -> &s { 
    input 
} 

fn main() { 
    let my_struct1 = s("a".to_owned()); 
    let s(foo) = my_struct1; 
    let my_struct2 = s("b".to_owned()); 
    let &s(ref bar) = f(&my_struct2); 
} 

もう一つの方法は、最初のデリファレンスにあると&をドロップします。私は `sの(REFバー)= F(&my_struct2を)`試してみました

struct s(String); 

fn f(input: &s) -> &s { 
    input 
} 

fn main() { 
    let my_struct1 = s("a".to_owned()); 
    let s(foo) = my_struct1; 
    let my_struct2 = s("b".to_owned()); 
    let s(ref bar) = *f(&my_struct2); 
} 
+0

ではなく、あなたの答えのように:私は、これはルーストに好まれると思います。 '&'と 'ref'の組み合わせは二重参照と思われますが、私は間違っていると思っていました。 –

関連する問題