当前位置:嗨网首页>书籍在线阅读

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代码块,编译器会抛出一个错误提示信息,如下所示:

19.png 如果没有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表达式的强大构造来处理。接下来我们将会对它进行介绍。