11-条件和判断
1.3.6 条件和判断
Rust中的条件判断和其他语言中的类似,它们也遵循类C语言风格的if else结构:
// if_else.rs
fn main() {
let rust_is_awesome = true;
if rust_is_awesome {
println!("Indeed");
} else {
println!("Well, you should try Rust !");
}
}
在Rust中,if构造不是语句,而是一个表达式。在一般的编程用语中,语句不返回任何值,但表达式会返回值。这种区别意味着Rust中的if else条件总是会返回一个值。该值可以是empty类型的(),也可能是实际的值。无论花括号中的最后一行是什么,都会成为if else表达式的返回值。重点是要注意if和else分支应该具有相同的返回类型。如前所示,我们不需要在if条件表达式的两边添加括号,我们甚至可以将if else代码块的值分配给变量:
// if_assign.rs
fn main() {
let result = if 1 == 2 {
"Wait, what ?"
} else {
"Rust makes sense"
};
println!("You know what ? {}.", result);
}
当将要分配的值从if else表达式返回时,我们需要用分号作为结束标志。例如,if是一个表达式,那么let是一个声明,期望我们在结尾处有分号。在赋值的情况下,如果需要从前面的代码中删除else代码块,编译器会抛出一个错误提示信息,如下所示:
如果没有else代码块,当if条件的判断结果为false时,那么结果将是(),变量result的值将可能是两个,即()和&str。Rust不允许将多种类型的数据存储在一个变量中。因此,在这种情况下,我们需要if和else代码块返回相同的类型。此外,在条件分支中添加分号会更改代码的含义。通过在一些代码中的if代码块中的字符串之后添加分号,编译器会认为用户希望抛弃该值:
// if_else_no_value.rs
fn main() {
let result = if 1 == 2 {
"Nothing makes sense";
} else {
"Sanity reigns";
};
println!("Result of computation: {:?}", result);
}
在这种情况下,结果将是一个empty类型的(),这就是我们必须更改 println!({:?})表达式的原因;此类型无法以常规方式输出。对于更复杂的多值条件判断,Rust提供了被称为match表达式的强大构造来处理。接下来我们将会对它进行介绍。