从if语句中返回值具有“不匹配类型”错误

时间:2015-06-12 21:31:04

标签: rust

在下面的函数中,我匹配&str的第一个完整字符,如果它是*-_,是否是那些返回该字符,并使用_手臂检查字符是否为空格,否则返回'a'

fn print_character(text: &str) {
    let character: char = match text.chars().nth(0).unwrap() {
        ch @ '*' | ch @ '-' | ch @ '_' => ch,
        ch @ _ => {
            if !ch.is_whitespace() {
                return 'a';
            }
            ' '
        }
    };

    println!("{}", character);
}

当我运行代码时,我收到以下错误:

error[E0308]: mismatched types
 --> src/main.rs:6:24
  |
6 |                 return 'a';
  |                        ^^^ expected (), found char
  |
  = note: expected type `()`
             found type `char`

1 个答案:

答案 0 :(得分:7)

你不想在这里返回,你不是想从函数返回。只需使用'a'作为表达式。您还需要将空格字符作为其他分支,而不是单独存在。

if !ch.is_whitespace() {
    'a'
} else {
    ' '
}

为什么需要else

if是一个表达式,来评估某个值。这个价值需要一定的类型;它有时不能是char,有时也不是其他东西。如果你只是这样做:

if !ch.is_whitespace() {
    'a'
}

如果测试失败,if表达式会评估什么?语言只需要一个char分支,而不仅仅是评估一些任意的else值。如果您不想将if用作表达式,只是将其用于副作用,那么您可以忽略else。在这种情况下,它仍然是一个表达式,但它的值是()(无论测试是否通过),你需要用一个语句来结束它。