2025全伺服纸杯机+纸盘机实力厂家盘点:适配夜市摆摊,创业成本可控 - 品牌2026
2025/12/25 16:00:44
Rust 的if表达式是条件执行的基础结构,与其他语言中的if语句类似,但在 Rust 中它不仅是语句,更是表达式,这意味着它可以返回值。
if语句fnmain(){letnumber=7;ifnumber<5{println!("条件为真");}else{println!("条件为假");}}if作为表达式这是 Rustif最强大的特性之一:它可以返回值,因此可以用于赋值。
fnmain(){letcondition=true;// if 作为表达式使用,返回一个值letnumber=ifcondition{5// 注意:这里没有分号}else{6// 两个分支必须返回相同类型};println!("number 的值为: {}",number);// 输出: number 的值为: 5}else if链fnmain(){letnumber=6;ifnumber%4==0{println!("能被4整除");}elseifnumber%3==0{println!("能被3整除");}elseifnumber%2==0{println!("能被2整除");}else{println!("不能被2、3、4整除");}}fnmain(){letscore=85;letgrade=ifscore>=90{'A'}elseifscore>=80{'B'}elseifscore>=70{'C'}elseifscore>=60{'D'}else{'F'};println!("分数 {} 对应的等级是: {}",score,grade);}if表达式的关键特性fnmain(){letcondition=true;// 正确:两个分支都返回 i32letx=ifcondition{5}else{6};// 错误:类型不匹配// let y = if condition { 5 } else { "six" }; // 编译错误// 可以使用相同的枚举类型#[derive(Debug)]enumResult{Number(i32),Text(String),}letresult=ifcondition{Result::Number(5)}else{Result::Text("six".to_string())};println!("{:?}",result);}fnmain(){letx=10;letresult=ifx>5{lety=x*2;y+1// 这是块的最后表达式,作为返回值}else{x};println!("结果是: {}",result);// 输出: 结果是: 21}if条件中使用模式匹配fnmain(){letsome_value=Some(5);// 传统写法ifletSome(x)=some_value{println!("值是: {}",x);}// 结合 elseletmaybe_number:Option<i32>=None;ifletSome(x)=maybe_number{println!("值是: {}",x);}else{println!("没有值");}}if let与else iffnmain(){enumMessage{Quit,Move{x:i32,y:i32},Write(String),}letmsg=Message::Move{x:10,y:20};ifletMessage::Quit=msg{println!("退出消息");}elseifletMessage::Move{x,y}=msg{println!("移动到 ({}, {})",x,y);}elseifletMessage::Write(text)=msg{println!("写入: {}",text);}}Rust 不像其他语言那样自动转换类型为布尔值:
fnmain(){letnumber=5;// 正确:使用比较操作ifnumber!=0{println!("数字不是零");}// 错误:Rust 不会自动将数字转换为布尔值// if number { // 编译错误// println!("这不会编译");// }// 正确使用方式ifnumber>0{println!("正数");}}if表达式fnmain(){leta=10;letb=20;letmax=ifa>b{a}else{ifa==b{a// 也可以是 b,两者相等}else{b}};println!("最大值是: {}",max);// 更简洁的写法letmax2=ifa>b{a}elseifa==b{a}else{b};println!("最大值是: {}",max2);}structConfig{debug:bool,log_level:u8,}implConfig{fnlog_level_name(&self)->&'staticstr{ifself.debug{"DEBUG"}elseifself.log_level>=3{"INFO"}elseifself.log_level>=1{"WARN"}else{"ERROR"}}}fnmain(){letconfig=Config{debug:true,log_level:2};println!("日志级别: {}",config.log_level_name());}fnvalidate_age(age:u8)->Result<String,String>{letmessage=ifage<13{"儿童".to_string()}elseifage<20{"青少年".to_string()}elseifage<65{"成年人".to_string()}else{"老年人".to_string()};Ok(message)}fnmain(){matchvalidate_age(25){Ok(msg)=>println!("年龄分类: {}",msg),Err(e)=>println!("错误: {}",e),}}fncalculate_discount(price:f64,is_member:bool,coupon_code:Option<&str>)->f64{letbase_discount=ifis_member{0.1}else{0.0};letextra_discount=ifletSome(code)=coupon_code{ifcode=="SAVE20"{0.2}elseifcode=="SAVE10"{0.1}else{0.05}}else{0.0};lettotal_discount=ifbase_discount+extra_discount>0.3{0.3// 最大折扣30%}else{base_discount+extra_discount};price*(1.0-total_discount)}fnmain(){letfinal_price=calculate_discount(100.0,true,Some("SAVE20"));println!("最终价格: {:.2}",final_price);// 70.00}match的比较| 特性 | if表达式 | match表达式 |
|---|---|---|
| 返回值 | ✅ 是表达式 | ✅ 是表达式 |
| 模式匹配 | 有限(通过if let) | ✅ 完整支持 |
| 穷尽性检查 | ❌ 不检查 | ✅ 强制检查 |
| 多分支 | else if链 | 多个=>分支 |
| 适用场景 | 简单条件判断 | 复杂模式匹配 |
ifvsmatchfnexample(value:Option<i32>){// 简单条件判断 - 适合用 ififletSome(x)=value{println!("有值: {}",x);}// 多条件判断 - 适合用 ifletx=5;ifx>0&&x<10{println!("个位数");}// 复杂模式匹配 - 适合用 matchmatchvalue{Some(0)=>println!("零"),Some(1..=9)=>println!("个位数"),Some(10..=99)=>println!("两位数"),Some(_)=>println!("大数"),None=>println!("无"),}}// 不好:嵌套太深fnbad_example(x:i32,y:i32,z:i32)->i32{ifx>0{ify>0{ifz>0{x+y+z}else{x+y}}else{x}}else{0}}// 更好:使用早期返回或 matchfngood_example(x:i32,y:i32,z:i32)->i32{ifx<=0{return0;}ify<=0{returnx;}ifz<=0{returnx+y;}x+y+z}fnmain(){leta=true;letb=false;// 冗长写法letresult1=ifa{ifb{"both"}else{"a only"}}else{ifb{"b only"}else{"none"}};// 简洁写法letresult2=match(a,b){(true,true)=>"both",(true,false)=>"a only",(false,true)=>"b only",(false,false)=>"none",};println!("{} {}",result1,result2);}if表达式的特性fnprocess_data(data:&[i32])->String{// 在条件中计算结果letsum:i32=data.iter().sum();// 使用 if 表达式进行复杂的逻辑letcategory=ifdata.is_empty(){"空数据".to_string()}else{letavg=sumasf64/data.len()asf64;ifavg>100.0{format!("高平均值: {:.2}",avg)}elseifavg>50.0{format!("中平均值: {:.2}",avg)}else{format!("低平均值: {:.2}",avg)}};category}fnmain(){letdata=vec![30,40,50];println!("{}",process_data(&data));}Rust 的if表达式:
if let)match通过合理使用if表达式,可以编写出既安全又表达力强的 Rust 代码。