变量定义变量mut修饰变量可变fnmain(){letx5;println!(x {}, x);x6;// ❌ 编译错误默认不可变 println!(x {}, x);letmut y6;y7;}常量const 修饰常量必须定义数据类型const MAX_SCORE: u32100;// 全局常量必须注明类型 const PI: f643.14159;fnmain(){println!(最高分: {}, MAX_SCORE);println!(圆周率: {}, PI);// MAX_SCORE200;// ❌ 编译错误常量不可变}变量作用域fnmain(){letx5;letxx 1;// 遮蔽外层 x现在 x6{letxx *2;// 再遮蔽现在 x12println!(内部作用域: {}, x);//12}println!(外部作用域: {}, x);//6恢复成6}数据类型基础类型Rust是静态类型语言编译器需要知道变量类型类型说明示例整型无小数部分。默认i32。有符号i/ 无符号u长度 8/16/32/64/128 位以及isize/usize与架构相关let x: u32 42;浮点型默认f64双精度另有f32单精度。均遵循 IEEE-754 标准let x 2.0; // f64布尔型true/false占 1 字节let b: bool true;字符型占 4 字节Unicode 标量值支持 emoji、中文等let c ℤ;元组Tuple固定长度元素类型可不同解构 let (x, y, z) tup; 或索引 tup.0// 方式1不同类型组合let tup1 (500, 6.4, ‘a’);// 方式2显式标注类型let tup2: (i32, f64, u8) (100, 3.14, 1);数组Array固定长度元素类型必须相同分配在栈上索引 a[0]// 方式1直接列出元素let a [1, 2, 3, 4, 5];// 方式2显式标注类型和长度 [类型; 长度]let b: [i32; 3] [10, 20, 30];整型溢出处理Debug 模式溢出触发 panic程序崩溃。Release 模式进行二进制补码包裹如 u8 的 256 变成 0。显式处理方法wrapping_、checked_溢出返回 None、overflowing_、saturating_。fnmain(){leta: u8255;// wrapping_add: 溢出后绕回到最小值letba.wrapping_add(1);//25510(u8 溢出包裹)letca.wrapping_add(2);//25521println!(a {}, a);//255println!(b {}, b);//0println!(c {}, c);//1// 其他 wrapping 方法letd0u8.wrapping_sub(1);//0-1255(绕回最大值)println!(d {}, d);//255}函数函数定义使用fn定义函数传递的参数需要显示定义类型fnmain(){greet(Alice,25);}// 每个参数都必须写类型 fn greet(name:str, age: i32){println!({} is {} years old., name, age);}返回值- 类型 声明返回值类型默认隐式返回函数体最后一个表达式的值不加 ;。也可使用 return 关键字提前返回。如果末尾加了 ;语句变成表达式返回单元类型 ()导致类型不匹配错误。fnmain(){letafive();// a5letbplus_one(5);// b6println!(a {}, b {}, a, b);}// 无参数返回 i32 fn five()-i32{5// 表达式隐式返回5}// 有参数返回 i32 fn plus_one(x: i32)-i32{x 1// 不加;隐式返回计算结果}// ❌ 错误示例加了分号 // fn plus_one_wrong(x: i32)-i32{// x 1;// 编译错误expectedi32, found()//}语句和表达式语句Statement表达式Expression特点执行操作不返回值计算并返回一个值示例let y 6;5 6、{ let x 3; x 1 }注意let语句不能赋值给其他变量代码块{}是表达式最后一行**不加 **;才会返回值。如果加了则代表是语句不返回值fnmain(){// ❌ 错误语句不返回值 //letx(let y6);// 编译错误 // ✅ 正确代码块{}是表达式最后一行不加;返回结果lety{letx3;x 1// 注意没有分号返回4};println!(y {}, y);// y4// 加了分号就变成语句返回()letz{leta10;a 1;// 有分号是语句返回()};println!(z {:?}, z);// z()}控制流条件条件语句的值必须是bool类型Rust不会自动转换fnmain(){letnumber6;ifnumber %40{println!(能被 4 整除);}elseifnumber %30{println!(能被 3 整除);// 执行这一行}elseifnumber %20{println!(能被 2 整除);// 跳过即使条件也为真}else{println!(不能被 4、3、2 整除);}letnumberifcondition{5}else{6};println!(number {}, number);//5}循环loop循环可以通过标签名:loop 标记外层循环并且通过break 便签名 直接跳出外层break 后面可以跟值作为整个 loop 表达式的结果fnmain(){letmut count0;counting_up: loop { println!(外层 count {}, count); let mut remaining 10; loop { println!( 内层 remaining {}, remaining); if remaining 9 { break; // 只退出内层循环 } if count 2 { break counting_up;// 直接退出外层循环}remaining -1;}count1;}println!(结束);}fnmain(){letmut counter0;letresultloop{counter1;ifcounter10{breakcounter *2;// 返回20}};println!(result {}, result);//20}while循环fnmain(){letmut number3;whilenumber!0{println!({}!, number);number -1;}println!(发射);}for循环fnmain(){leta[10,20,30,40,50];// 遍历数组forelementina{println!(值: {}, element);}}