预计bool,使用运算符时找到i32%

时间:2016-04-05 03:17:48

标签: rust

也许这是正常行为,但有人可以帮我解决这个问题:

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

更新

你可以看到这个测试,它不是相同的代码,但获得了相同的错误:

play.rust

2 个答案:

答案 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);