Skip to content

函数

函数是 Rust 中的基本构建块,用于封装可重用的代码逻辑。函数定义了输入参数和返回值类型,并包含一个函数体来执行特定任务。

函数定义

基础语法

rust
fn add_num(x: i32, y: i32) -> i32 {
    x + y
}

函数定义规范

  • 使用 fn 关键字声明新函数
  • 函数名遵循蛇形命名法(snake_case)
  • 必须声明每个参数的类型和返回值类型
  • 函数默认返回 ()
rust
// 一个没有参数,也没有返回值的函数
fn print_line() {
    println!("++++++++++++++++");
}

// 一个有参数,没有返回值的函数
fn print(x: u32) {
    println!("result is {:?}", x);
}

// 一个有参数,也有返回值的函数
fn sum(a: u32, b: u32) -> u32 {
    a + b
}

// main函数是rust程序的入口函数
fn main() {
    print_line();
    let a = 1u32;
    let b = 2u32;
    let r = sum(a, b);
    print(r);
}

函数中定义函数

函数也可以直接定义在函数内部。例如在函数a中定义函数b,这样函数b就只能在函数a中访问或调用:

rust
fn a() {
    fn b() {
        println!("I am function b, defined inside function a");
    }
    b(); // 在函数a中调用函数b
}

函数返回值

隐式返回

函数体最后一个表达式的值会被自动返回,一定不能加分号,否则会变成语句:

rust
fn add_num(x: i32, y: i32) -> i32 {
    x + y // 隐式返回,一定不能加分号,会变成语句
}

显式返回

使用 return 关键字可提前返回指定值:

rust
fn early_return(x: i32) -> i32 {
    if x < 0 {
        return 0; // 必须加分号,否则会变成表达式
    }
    x
}

return 关键字不指定值时,表示返回的是 ()

表达式返回

if 也是表达式,可以直接返回值:

rust
fn max(a: i32, b: i32) -> i32 {
    if a > b {
        a
    } else {
        b
    }
}

实用调试宏

Rust 提供了几个实用的调试宏来帮助开发者标记代码中的特定位置或状态,这在写调试代码或占位代码时非常有用:

说明
todo!()标记未完成的代码,运行时 panic,编译不报错
unimplemented!()标记故意不实现的功能,运行时 panic
unreachable!()标记理论上不可能到达的分支,运行时若到达则 panic

他们的使用方式和 println!() 类似,都可以接受一个格式化字符串参数来提供更多上下文信息:

rust
fn example() {
    // 标记一个未完成的功能
    todo!("This function is not implemented yet");

    // 标记一个故意不实现的功能
    unimplemented!("This feature is intentionally left unimplemented");

    // 标记一个理论上不可能到达的分支
    let x = 5;
    if x < 0 {
        unreachable!("Negative numbers are not expected here");
    }
}

基于 MIT 协议发布