跳转至

条件判断

Rust 使用 if、else if 和 else 表达分支。条件必须是 bool,不会把整数、字符串或 引用隐式转换为真假值。

基本 if

fn main() {
    let temperature = 31;

    if temperature >= 35 {
        println!("高温");
    } else if temperature >= 25 {
        println!("温暖");
    } else {
        println!("凉爽");
    }
}

多个条件按顺序判断,命中后不再检查后续分支。条件复杂时可提取为有业务含义的布尔变量, 避免在 if 中堆叠难以审查的逻辑。

if 是表达式

if 可以产生值,因此可直接初始化绑定:

fn main() {
    let score = 86;
    let level = if score >= 90 {
        "A"
    } else if score >= 60 {
        "B"
    } else {
        "C"
    };
    println!("level = {level}");
}

所有可能正常完成的分支必须返回兼容类型。if condition { 5 } else { "five" } 会编译失败。 用于赋值时通常需要完整的 else,否则缺失分支的值是 ()。

match

match 适合枚举、离散值和需要穷尽检查的分支:

fn main() {
    let code = 404;
    let message = match code {
        200 => "ok",
        400..=499 => "client error",
        500..=599 => "server error",
        _ => "other",
    };
    println!("{message}");
}

每个分支称为 arm,形式是 pattern => expression。match 必须穷尽所有可能值,_ 可作为 兜底模式,但若枚举变化值得显式处理,过早使用 _ 可能隐藏新状态。

matches! 与 if let

只关心值是否匹配某个模式时可使用 matches!:

fn main() {
    let status = Some(200);
    let success = matches!(status, Some(200..=299));
    println!("success = {success}");

    if let Some(code) = status {
        println!("code = {code}");
    }
}

matches!(expression, pattern) 返回 bool,还可添加 match guard。if let 适合只处理一个 主要模式,其他情况忽略或放入 else;需要多个结构化分支时优先 match。

常见错误与工程说明

  • 写 if number 会失败,应写明确条件,如 if number != 0。
  • = 是赋值相关语法,比较相等使用 ==。
  • 分支尾表达式误加分号会把该分支变为 (),造成分支类型不一致。
  • 浮点 NaN 会让常规大小比较返回 false,输入可能非有限值时应先检查。
  • 权限、安全策略等条件应采用默认拒绝并覆盖边界测试,避免复杂否定逻辑。

练习

编写程序把 HTTP 状态码映射为 success、redirect、client error、server error 或 unknown。先用 match 返回字符串,再用 matches! 单独判断它是否为成功状态。