2016-11-18 3 views
2

条件が真である配列内の要素を取得したい。 the trait bound '&{integer}: std::cmp::PartialEq<{integer}>' is not satisfiedたとえばIは、配列要素が0借用した整数とリテラル整数を比較する

fn main() { 
    let lim = 10; 
    let mut sieve = vec![0; lim+1]; 
    sieve[1] = 1; 
    println!("{:?}", sieve.iter() 
     .enumerate() 
     .filter(|&(_, c)| c != 0) 
     .map(|(i, _)| i) 
     .collect::<Vec<usize>>()); 
} 

されているが、これはコンパイルエラーであるすべてのインデックスを希望します。私がc.clone() != 0を使用すると動作します。

私がエラーメッセージを正しく理解していれば、借りている整数と整数を借りて比較することはできません。私はなぜそれが不可能であってはならないのか分かりません。

+0

はい 'への変更* c'は動作します。しかし、なぜ私はそれを逆参照しなければならないのですか? –

答えて

5

エラーは正しく解釈され、その理由は単純に実装されていないためです。標準ライブラリの作者がこの作業をしたい場合、&i32 == i32i32 == &i32&mut i32 == i32i32 == &mut i32&i32 == &mut i32および&mut i32 == &i32の場合にPartialEqを実装する必要があります。そして彼らは、他のすべてのプリミティブ型のためにそれを行う必要があるだろう(i8i16u8u16u32i64u64f32f64、およびchar)。

これは、ロットPartialEqの実装です。

代わりに、言語のユーザーに*c != 0と尋ねることができます。

(あなたがC++から来ている場合は、理解するために重要なことは、文法的に、借りが複数の参照よりもポインタのようであるということである。唯一のメソッド呼び出しの構文は自動被参照機能があります。)

関連する問題