2016-04-05 1 views
0

を使用している場合たぶん、これは正常な動作です、誰かがこれで私を助けることができるI32が見つかりました:期待ブール値は、オペレータ%

trait Flujo<T: std::clone::Clone> { 
    fn filter<F: Fn(T)->bool>(&self, prot: F); 
} 

impl<T: std::clone::Clone> Flujo<T> for Test<T> { 
    fn filter<F: Fn(T)->bool>(&self, prot: F){ 
    ..// 
    } 
} 

この単純なテストは

test.filter(|x| -> bool{ 

    true 
}); 

が、私がしようとする作品にこの

test.filter(|x| -> bool{ 
    //return x % 2 ? true : false; 

    if x % 2 { <-- Error 
     return true;    
    } else{ 
     return false; 
    } 
}); 

エラー:

mismatched types: 
expected `bool`, 
    found `i32` [E0308] 
if value % 2 { 
    ^~~~~~~~~ 

私は検索と読みますが、2番目のリンクはかなり理解していない、これが失敗した理由を誰かが私に説明することができます。

https://doc.rust-lang.org/reference.html#arithmetic-operators

https://doc.rust-lang.org/std/ops/trait.Rem.html


更新:

あなたがこのテストで見ることができ、それは同じコードではありませんが、同じエラーが得られる:

play.rust

+5

まあエラーが無い、かなり明確なのですか? '%'は 'bool'ではなく' i32'を返します。単純に '== 0'または' == 1'を追加してブール式を使用するだけですか?どのようにコンパイラの診断がより簡単になるかわからない –

+0

@VeronikaPrüsselsあなたは絶対に正しいです、それは申し訳ありませんが、彼を見ていない私はより多くのテストをしなければならなかった、と私はおそらく他のものの影響を分析していないhttp://ideone.com/LHtu8p –

答えて

4

タイプはx % 2です。これは整数ですが、ifにはブール値が必要です。この点で、錆は、もう少しJavaのようなもので、C.

としてはあまりこれは予想おそらくとして、働く:

fn b(value: i32) { 
    if (value % 2) == 0 { 
     println!("1");   
    } else{ 
     println!("2"); 
    } 
} 

fn main() { 
    b(2); 
} 

@VeronikaPrüsselsが同時にコメントしているとおりに。

+0

私はこのエラーをご迷惑をおかけしていない新しい言語のことを知っていた、とあなたの時間のためにありがとう –

4

C、C++およびおそらく他の言語では、整数を暗黙的にブール値に変換できます。 Rustではそうではありません:Rustは、驚きを避けるために、プリミティブ型(整数から整数、整数からブールなど)間の暗黙の変換を決して実行しません。

CまたはC++のように動作するブール式に変換するには、整数に評価される式(正しい演算子の優先順位を得るには括弧を追加する必要がある場合があります)に式!= 0を追加するだけです。

test.filter(|x| -> bool { 
    if x % 2 != 0 { 
     return true; 
    } else { 
     return false; 
    } 
}); 

か、単に:

test.filter(|x| x % 2 != 0); 
+0

あなたは正しいhttps :// ideone。com/LHtu8pしかし、私はより多くのテストをしなければなりませんでした。私がやった最初のことはドキュメンテーションを探すことでした。暗黙のコンバージョンの宣言に対するあなたの感謝を考えずに、エラーメッセージをよく知っていました。試してみてください== 0またはそうでなければ –

+2

恐ろしい 'if'を単純化してくれてありがとう! –

関連する問題