也许这是正常行为,但有人可以帮我解决这个问题:
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 {
^~~~~~~~~
我搜索并阅读,但第二个链接不太明白,有人可以解释为什么会失败。
https://doc.rust-lang.org/reference.html#arithmetic-operators
https://doc.rust-lang.org/std/ops/trait.Rem.html
更新
你可以看到这个测试,它不是相同的代码,但获得了相同的错误:
答案 0 :(得分:4)
x % 2
的类型很重要。它是一个整数,但if
需要一个布尔值。在这方面,Rust有点像Java,而不像C。
这可能与预期一样有效:
fn b(value: i32) {
if (value % 2) == 0 {
println!("1");
} else{
println!("2");
}
}
fn main() {
b(2);
}
正如@VeronikaPrüssels同时评论的那样。
答案 1 :(得分:4)
在C,C ++和其他语言中,整数可以隐式转换为布尔值。 Rust中的情况并非如此:Rust将永远不会执行原始类型之间的隐式转换(无论是整数到整数,整数到浮点数,整数到布尔值等),以避免出现意外。
您需要做的就是将!= 0
添加到求值为整数的表达式(您可能需要添加括号以获得正确的运算符优先级),将其转换为布尔表达式,其行为类似于C或C ++。
test.filter(|x| -> bool {
if x % 2 != 0 {
return true;
} else {
return false;
}
});
或只是:
test.filter(|x| x % 2 != 0);