Skip to content

语句和表达式

语句和表达式是构成程序的基本单元。Rust 的语句和表达式比较特别,末尾是否添加 ; 决定了它们的性质。理解它们之间的区别对于编写有效的 Rust 代码至关重要。

语句 (Statements)

定义: 语句是执行某些操作但不返回值的指令,但 Rust 中语句的值是 () (单元类型)。

特点:

  • 执行操作但不返回值
  • 末尾通常以分号 ; 结束
  • 语句的值为 () (单元类型)

语句类型:

  1. 变量声明: let x = 5;
  2. 函数定义: fn foo() {}
  3. 表达式加分号: 5 + 6;

示例:

rust
let a = 5;           // 变量声明语句
let b = {5 + 6;};    // 有分号,是语句,返回值为 ()
let b = {5 + 6};     // 块表达式,等于 let b = 5 + 6; ✅ 正确: 表达式返回值赋给变量
let b = (5 + 6);     // 括号表达式,等于 let b = 5 + 6; ✅ 正确: 表达式返回值赋给变量

表达式 (Expressions)

定义: 表达式计算并产生一个值,可以赋值给变量或作为函数返回值。

特点:

  • 计算并返回一个值
  • 末尾不加分号
  • 加分号就会变成语句,返回值变为 ()

表达式类型:

  1. 数值计算: 5 + 6
  2. 函数调用: add(1, 2)
  3. 块表达式: { let x = 5; x + 1 }
  4. 括号表达式: (5 + 6)
  5. if 条件表达式: if condition { 10 } else { 20 }
  6. match 模式匹配
  7. loop 循环表达式

示例:

rust
// 块表达式,返回 6
let y = {
    let x = 5;
    x + 1;  // 有分号,是语句,返回值为 ()
    x + 1  // 无分号,是表达式,返回值为 6
};

// if 作为表达式
let result = if condition { 10; } else { 20; }; // 有分号,是语句,返回值为 ()
let result = if condition { 10 } else { 20 };   // 无分号,是表达式,返回值为 10 或 20

语句 vs 表达式

特性语句表达式
返回值不返回值,返回()返回计算结果
末尾符号; 结束无分号
赋值不可赋值可赋值给变量

重要

  • Rust 中 几乎所有的语句都是表达式,但并非所有的表达式都是语句
  • 末尾无分号 → 表达式 → 返回一个值(默认调用 return)
  • 末尾有分号 → 语句 → 返回值为 ()

在 Rust 中,只有以下两种情况是真正的语句:

  • 声明语句:例如 let x = 5;。你不能把它赋值给别人(如 let y = (let x = 5); 会报错)。
  • 表达式语句:在表达式后面加上分号 ;。分号会强行吞掉返回值,使其变成 ()(单元类型)。

基于 MIT 协议发布