2017-12-31 44 views
1

私は列挙型のVecをソートしようとしています。並べ替えの仕組み自体を無視してください。これはちょうど解体された例です。非参照型の参照を解除するときに、逆参照された参照のタプルで一致が機能しないのはなぜですか?

error[E0507]: cannot move out of borrowed content 
    --> src/main.rs:12:44 
    | 
12 |  my_list.sort_unstable_by(|a, b| match (*a, *b) { 
    |           ^^ cannot move out of borrowed content 

次の二つの変種が働く:

use std::cmp::Ordering; 

enum MyEnum { 
    Option1, 
    Option2, 
} 

fn main() { 
    let mut my_list: Vec<MyEnum> = vec![MyEnum::Option1, MyEnum::Option2, MyEnum::Option1]; 

    // (1) - doesn't work 
    my_list.sort_unstable_by(|a, b| match (*a, *b) { 
     (MyEnum::Option1, MyEnum::Option1) => Ordering::Equal, 
     (MyEnum::Option1, MyEnum::Option2) => Ordering::Less, 
     _ => Ordering::Greater 
    }); 
} 

は、私は次のエラーを取得することを間接参照

// (2) 
my_list.sort_unstable_by(|a, _b| match *a { 
    MyEnum::Option1 => Ordering::Less, 
    MyEnum::Option2 => Ordering::Greater 
}); 

// (3) 
my_list.sort_unstable_by(|a, b| match (a, b) { 
    (&MyEnum::Option1, &MyEnum::Option1) => Ordering::Equal, 
    (&MyEnum::Option1, &MyEnum::Option2) => Ordering::Less, 
    _ => Ordering::Greater 
}); 

私は無地の参照を一致させたい、私ができる(バリアント2) ;なぜこれは変種1のタプル内で動作しませんか?

私は3つの理由は理解していますが、1で動きがどこで発生するのか、それをどうやって行うのかを理解するのには苦労します。

+0

(これは、あなたの質問に答えていませんが、これを回避する一つの方法は、 '#を追加することです[導き出しますクローン、コピー)] 'を選択します。これは、列挙型をコピータイプにして、あなたがそれから出ることができ、オリジナルはまだ有効です。 – Ryan

答えて

2

where exactly a move happens

コンパイラが指しているところでは、移動が発生します(*a)。 aの内容を新しいタプルに移動しています。あなたはそれを行うことはできませんので、コンパイラはエラーを出します。

実際にそれを逆参照せずに「逆参照」への能力マッチした変数は、コンパイラによって提供されるいくつかの構文上の良さであるが、それは非常に限られます。それは表現を「見る」というわけではありませんが、いくつかの選択された構文構造だけを見て、それらを無視することを知っています。

それは可能ですコンパイラはこれらのケースを見るために強化される可能性がありますが、おそらくこの時点でコスト/利益のトレードオフは好ましくありません。

も参照してください:

+0

ああ、OK ...リンクのためのおかげで、私は質問を投稿する前にそれらを見つけることができませんでしたが、特に最初のものは、すでに私の質問に答えます。 – mrspl

+0

@mrspl https://stackoverflow.com/q/43370054/155423は、あなたの質問に答えるならば、私はその1の重複としてこの質問をマークすることができますが、私はそれを削除することができます前に答えをunacceptする必要があります。 – Shepmaster

+0

本当に他の_question_と重複しているかどうかはわかりません。 _answer_の2番目の部分だけが私の質問に答えることもありますが、それは他のスレッドで尋ねられたものではありません。私はそれをまだ重複しているとマークしなければならないと思いますか? – mrspl

関連する問題