2014-07-04 1 views
4

я пытался реализовать FizzBuzz в Русте и не с какой-то тайной ошибки:Rust выражение "несогласованные типы: ожидается,`() `"

fn main() { 
    let mut i = 1; 

    while i < 100 { 
     println!("{}{}{}", 
       if i % 3 == 0 { "Fizz" }, 
       if i % 5 == 0 { "Buzz" }, 
       if !(i % 3 == 0 || i % 5 == 0) { 
        i 
       }); 
     i += 1; 
    } 
} 

Ошибка:

error: mismatched types: expected `()` but found `&'static str` (expected() but found &-ptr) 
       if i % 3 == 0 { "Fizz" }, 
           ^~~~~~~~~~ 
error: mismatched types: expected `()` but found `&'static str` (expected() but found &-ptr) 
       if i % 5 == 0 { "Buzz" }, 
           ^~~~~~~~~~ 
error: mismatched types: expected `()` but found `<generic integer #0>` (expected() but found integral variable) 
       if !(i % 3 == 0 || i % 5 == 0) { 
        i 
       }); 

Или в более новых версиях Ржавчина с сообщением об ошибке слегка видоизмененной:

error: if may be missing an else clause [--explain E0308] 
        if i % 3 == 0 { "Fizz" }, 
        ^^^^^^^^^^^^^^^^^^^^^^^^ expected(), found &-ptr 
note: in this expansion of format_args! 
note: in this expansion of print! (defined in <std macros>) 
note: in this expansion of println! (defined in <std macros>) 
note: expected type `()` 
note: found type `&'static str` 

error: if may be missing an else clause [--explain E0308] 
       if i % 5 == 0 { "Buzz" }, 
       ^^^^^^^^^^^^^^^^^^^^^^^^ expected(), found &-ptr 
note: in this expansion of format_args! 
note: in this expansion of print! (defined in <std macros>) 
note: in this expansion of println! (defined in <std macros>) 
note: expected type `()` 
note: found type `&'static str` 

error: if may be missing an else clause [--explain E0308] 
       if !(i % 3 == 0 || i % 5 == 0) { 
       ^expected(), found integral variable 
note: in this expansion of format_args! 
note: in this expansion of print! (defined in <std macros>) 
note: in this expansion of println! (defined in <std macros>) 
note: expected type `()` 
note: found type `_` 

Я нашел why does removing return give me an error: expected '()' but found, но добавление return, как было предложено, не помогло.

Что означают эти ошибки и как я могу избежать их в будущем?

+1

Btw, вы должны использовать 'для ввода в диапазоне (1, 100) {...}' 'вместо while' + ручной инкрементирования. – huon

ответ

8

Проблема в том, что if i % 3 == 0 { "Fizz" } возвращает либо блок (), либо &'static str. Измените выражения if, чтобы возвращать один и тот же тип в обоих случаях, например, добавив else { "" }.

+0

Тогда у меня проблема с последней - если я делаю 'i.to_str()', чтобы сделать их одинаковыми, я получаю 'error: if и else имеют несовместимые типы: expected \' collections :: string :: String \ ', но найден \' & 'static str \ '(ожидаемые структуры struct: string: String, но found & -ptr)' –

+0

'' ".to_str()' для сопоставления типов в последнем случае. Кстати, более идиоматический fizzbuzz будет использовать match и println! для каждого матча. Посмотрите, сможете ли вы реорганизовать свой код после того, как вы начнете работать. –

+1

В чем разница между строкой, возвращаемой 'to_str' и простой' '' ', является одной из них в штучной упаковке? –

-1

В моем случае, как новичок, я добавил «;» в return заявлении

fn add_one(x: i32) -> i32 { 
    x + 1; // remove ";" from return 
}