2016-04-05 12 views
0

Belki bu normal bir davranıştır, ama birisi bana bu konuda yardımcı olabilir: Ben çalıştığınızdaBeklenen bool, bulunan i32 operatör% kullanırken

test.filter(|x| -> bool{ 

    true 
}); 

çalışan bu basit testte

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){ 
    ..// 
    } 
} 

ama Bu

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

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

Hata:

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

Ben arandı ve okumak, ama ikinci bağlantı oldukça Bu başarısız neden birisi bana açıklayabilir, anlıyorum.

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

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


Güncelleme:

Bu testle görebilirsiniz, aynı kodu değil, fakat aynı hata elde edilir:

play.rust

+5

Eh hata yok oldukça açıktır? '%' i32'yi döndürür, bool' değil. Bunun yerine bir boole ifadesine sahip olmak için '== 0' veya' == 1' ekleyin. Derleyici tanısının nasıl daha açık olabileceğinden emin değilim. –

+0

@ VeronikaPrüssels kesinlikle haklısınız, bunun için üzgün bir soru, ama onu daha fazla test etmek zorunda olduğumu görmedim, yaptığım ilk şey belgeleri araştırmaktı. ve belki de başka şeylerden etkilenenleri iyi analiz edemiyorum http://ideone.com/LHtu8p –

cevap

4

x % 2'un türü önemlidir. Bu bir tam sayıdır, ancak if bir boole değeri bekler.

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

fn main() { 
    b(2); 
} 

Tam @Veronika Prüssels aynı anda yorumladı gibi: Bu bağlamda, Pas beklendiği muhtemelen biraz daha Java gibidir ve bu işleri C

olarak daha az.

+0

Bu hatayı daha önce görmediğim yeni dilin daha çok farkındaydım ve zamanınız için teşekkürler –

4

C, C++ ve büyük olasılıkla diğer dillerde, tamsayılar dolaylı olarak boole'ye dönüştürülebilir. Rust'taki durum bu değil: Pas, sürprizlerden kaçınmak için ilkel türler arasında (tamsayıya tamsayı, yüzdelik tamsayı, boole, tamsayı, vb.) Örtülü dönüşümler yapmaz.

Yapmanız gereken tek şey, bir tam sayı olarak değerlendiren ifadeye (doğru operatör önceliğini almak için parantez eklemeniz gerekebilir) C veya C++ gibi davranan bir boole ifadesine dönüştürmek için != 0 eklemektir.

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

ya da sadece:

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

doğru https : // ideone.com/LHtu8p ama daha fazla test edilmem gerekiyordu, yaptığım ilk şey dökümantasyonda arandı ve söyledikleriniz hakkında ne düşündüğünüzü düşünmüyorum, örtük dönüşümlerin bildirimi için teşekkürler, hata mesajlarının daha fazla farkındaydım, == 0 veya başka bir şekilde –

+2

deneyin. –