Rust 从if语句中返回的值有一个;“不匹配的类型”;错误

Rust 从if语句中返回的值有一个;“不匹配的类型”;错误,rust,Rust,在下面的函数中,我匹配&str的第一个完整字符,如果它是*,-或\uu,如果返回的是那些字符,我想用\uarm检查字符是否为空白,否则返回'a' fn print_character(text: &str) { let character: char = match text.chars().nth(0).unwrap() { ch @ '*' | ch @ '-' | ch @ '_' => ch, ch @ _ => {

在下面的函数中,我匹配
&str
的第一个完整字符,如果它是
*
-
\uu
,如果返回的是那些字符,我想用
\u
arm检查字符是否为空白,否则返回
'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);
}
运行代码时,出现以下错误:

错误[E0308]:类型不匹配
-->src/main.rs:6:24
|
6 |返回“a”;
|^^^应为(),找到字符
|
=注意:应为类型“”()`
找到类型`字符`

如果您不希望在此处返回,则不会尝试从函数返回。只需使用
'a'
作为表达式。您还需要将空格char作为else分支,而不是单独存在

if !ch.is_whitespace() {
    'a'
} else {
    ' '
}
为什么需要
else
如果
是一个表达式,它必须计算为某个值。该值需要一个确定的类型;它有时不能是
字符,有时也不能是其他字符。如果你只是这样做:

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

如果测试失败,
表达式的计算结果是什么?该语言不只是计算某个任意的
char
值,而只是需要一个
else
分支。如果您不想将
If
用作表达式,而只是将其用于其副作用,则可以省略
else
。在这种情况下,它仍然是一个表达式,但是它的值是
()
(无论测试是否通过),并且您需要用一条语句结束它。

为什么它必须在
else
语句中,而不是在
if
语句之后?我还应该说,如果它不在
else
@Aaronepower中,它就像
'a'
一样不起作用:因为如果没有else,if的值总是
()
,但是你试图让它作为
字符来计算。模式保护也很好:
ch-if-ch.is_-whitespace()=>,_u=>a'