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'