2016-04-05 2 views
0

Может быть, это нормальное поведение, но кто-то может помочь мне с этим:Ожидаемое BOOL, найдено 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 { 
    ^~~~~~~~~ 

Я искал и читал, но вторая ссылка не совсем понимаю, кто-то может мне объяснить, почему это не удается.

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

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


Обновление:

Вы можете видеть с этим тестом, это не тот же самый код, но получается та же ошибка:

play.rust

+5

Ну ошибка довольно ясно, нет? '%' возвращает 'i32', а не' bool'. Просто добавьте '== 0' или' == 1' вместо булевого выражения? Не уверен, что диагностика компилятора может быть более простой lol –

+0

@ VeronikaPrüssels у вас абсолютно прав, это глупый вопрос, извините за это, но не видел его. Мне пришлось бы тестироваться больше, первое, что я сделал, - это поиск документации и и я плохо анализирую, возможно, под влиянием других вещей. http://ideone.com/LHtu8p –

ответ

4

Тип x % 2 вопросов. Это целое число, но if ожидает логическое значение. В связи с этим, ржавчина немного больше похоже на Java, и меньше, как С.

Это работает, вероятно, как и ожидалось:

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

fn main() { 
    b(2); 
} 

Точно так же как @Veronika Prüssels прокомментировал в то же время.

+0

Я больше знал о новом языке, который не видел эту ошибку, извините за это, и спасибо за ваше время –

4

В C, C++ и, возможно, в других языках целые числа могут быть неявно преобразованы в булевы. Это не относится к Rust: Rust никогда не будет выполнять неявные преобразования между примитивными типами (будь то целое число integer, integer для float, integer to boolean и т. Д.), Чтобы избежать неожиданностей.

Все, что вам нужно сделать, это добавить != 0 к выражению, которое оценивает целое число (возможно, вам нужно будет добавить круглые скобки, чтобы получить правильный приоритет оператора), чтобы превратить его в логическое выражение, которое ведет себя как на C или C++.

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

или просто:

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

вы правы https : // ideone.com/LHtu8p, но мне пришлось бы тестировать больше, первое, что я сделал, это поиск документации, и я не перестаю думать о том, что вы сказали спасибо за объявление неявных преобразований, я больше знал об ошибках, я не буду try == 0 или иначе –

+2

Спасибо за упрощение этого ужасного 'if', а! –

Смежные вопросы