私は列挙型の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で動きがどこで発生するのか、それをどうやって行うのかを理解するのには苦労します。
(これは、あなたの質問に答えていませんが、これを回避する一つの方法は、 '#を追加することです[導き出しますクローン、コピー)] 'を選択します。これは、列挙型をコピータイプにして、あなたがそれから出ることができ、オリジナルはまだ有効です。 – Ryan