Rust快速入门(1) - 通用编程概念

1. 变量和可变性

Rust 变量默认是不可变的(immutable),这是 Rust 安全性和简单并发的设计基础之一。

变量声明与修改

  • 使用 let 关键字声明变量:let x = 5;
  • 使用 mut 关键字使变量可变:let mut x = 5;
  • 不可变变量尝试修改会导致编译错误

常量

  • 使用 const 关键字声明:const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
  • 与不可变变量的区别:
    • 不能使用 mut 修饰
    • 必须注明类型
    • 可以在任何作用域声明,包括全局作用域
    • 只能设置为编译时常量表达式,不能是运行时结果

变量遮蔽(Shadowing)

  • 可以使用同一个变量名重新声明变量:let x = 5; let x = x + 1;

  • 遮蔽与

  mut

的区别:

  • 遮蔽需要使用 let 关键字,否则会编译错误
  • 遮蔽允许改变变量类型,而 mut 不允许

2. 数据类型

Rust 是静态类型语言,必须在编译时知道所有变量的类型。

标量类型

整数类型

  • 有符号整型:i8, i16, i32, i64, i128, isize
  • 无符号整型:u8, u16, u32, u64, u128, usize
  • 默认为 i32
  • 整数字面量可以使用多种表示方式:
    • 十进制:98_222
    • 十六进制:0xff
    • 八进制:0o77
    • 二进制:0b1111_0000
    • 字节(仅限u8):b'A'
  • 整型溢出:
    • Debug 模式:导致 panic
    • Release 模式:执行二进制补码包裹(wrapping)

浮点类型

  • f32:32 位浮点数(单精度)
  • f64:64 位浮点数(双精度,默认类型)

布尔类型

  • bool 类型:值为 truefalse
  • 大小为一个字节

字符类型

  • char 类型:使用单引号声明,如 'z'
  • 大小为四个字节,表示 Unicode 标量值
  • 可以表示:ASCII、标音字母、中日韩文字、emoji 等

复合类型

元组(Tuple)

  • 将多个不同类型的值组合成一个复合类型
  • 长度固定,一旦声明不能增减
  • 声明:let tup: (i32, f64, u8) = (500, 6.4, 1);
  • 访问方式:
    • 解构:let (x, y, z) = tup;
    • 索引:let five_hundred = x.0;
  • 单元元组:(),表示空值/无返回值

数组(Array)

  • 多个相同类型的值的集合
  • 长度固定
  • 声明:let a = [1, 2, 3, 4, 5];
  • 类型声明:let a: [i32; 5] = [1, 2, 3, 4, 5];
  • 快速创建相同值的数组:let a = [3; 5]; 等同于 [3, 3, 3, 3, 3]
  • 访问元素:let first = a[0];
  • 数组越界:运行时会检查并导致 panic

3. 函数

函数在 Rust 中非常普遍,使用 fn 关键字声明。

函数定义

  • 命名风格:snake_case(全小写,使用下划线分隔单词)

  • 基本语法:

  fn function_name(parameter1: Type1, parameter2: Type2) -> ReturnType {    // 函数体}

参数

  • 必须声明每个参数的类型
  • 形参(parameter):函数定义中的变量
  • 实参(argument):调用函数时传入的具体值

语句和表达式

  • 语句(Statement):执行操作但不返回值的指令,如 let y = 6;
  • 表达式(Expression):计算并产生值的代码,如 5 + 6
  • 表达式不加分号,加了分号就变成语句
  • 代码块 {} 也是表达式

返回值

  • 使用 -> 后接类型来声明返回类型
  • 隐式返回最后一个表达式的值
  • 可以使用 return 关键字提前返回

4. 注释

Rust 支持多种注释形式:

行注释

  • 使用 // 从注释开始到行尾
  • 代码后注释:let lucky_number = 7; // I'm feeling lucky today
  • 多行注释需在每行开头使用 //

文档注释

  • 在第 14 章中详细讨论

5. 控制流

if 表达式

  • 基本语法:
  if condition {    // code} else {    // code}
  • 条件必须是 bool 类型

  • 可使用 else if 处理多重条件

  • if 是表达式,可用于赋值:let number = if condition { 5 } else { 6 };

  • 所有分支的返回值类型必须相同

循环

Rust 提供三种循环:

loop

  • 重复执行代码直到明确停止:
  loop {    // code}
  • 使用 break 退出循环

  • 使用 continue 跳过当前迭代

  • 可以返回值:let result = loop { if condition { break value; } };

  • 循环标签:通过 'label: loop {} 命名循环,并使用 break 'label; 退出特定循环

while

  • 当条件为真时执行循环:
  while condition {    // code}

for

  • 用于遍历集合元素:
  for element in collection {    // code}
  • 相比 while 更安全、更简洁

  • 可以与 Range 一起使用:for number in 1..4 {}

  • 可以反转 Range:for number in (1..4).rev() {}

总结

Rust 鼓励开发者采用一些最佳实践,如默认不可变变量、强类型检查、表达式为主的语法等,这些都有助于编写更安全、更可靠的代码。


好好学习,天天向上