Rust 函数详解:语法、返回值与高阶用法

Mason
Mason
发布时间:2026-10-16 | 5人浏览过
原创

Rust 作为一门多范式编程语言,高度重视函数的地位,将其视为“一等公民”。本文系统梳理 Rust 函数的定义、参数处理、返回值机制及高阶应用,涵盖基础语法到高级特性的完整知识点。

函数基础与入口

在 Rust 中,程序执行的唯一入口是 main 函数。与其他语言不同,Rust 通过 fn 关键字来声明和定义函数。为了保证代码风格的一致性,函数命名必须遵循 snake_case 规范,即全小写字母并使用下划线分隔单词。

第1步:定义标准函数入口

目的是创建程序启动点,输出基础信息以验证环境正常。

  1. 使用 fn main() 声明主函数。
  2. 在函数体内调用 println! 宏打印字符串。
fn main() {
    println!("Hello, world!");
}

函数参数传递规则

Rust 的参数定义需要显式指定数据类型。声明格式为 参数名: 参数类型。即使函数不需要任何输入参数,括号也必须保留且为空。

第2步:编写有参与无参函数

目的:展示参数声明的两种形态及引用类型的传递方式。

  1. 定义无参函数,不接收任何数据。
  2. 定义有参函数,使用借用 (&) 传递字符串切片引用,避免所有权转移。
// 定义一个无参函数
fn function() {
    println!("A function with no parameters.");
}

// 定义一个有参函数
fn hello(name: &str) {
  println!("Hello, {}.", name);
}

返回值与表达语义

Rust 中所有函数都有返回值。main 函数的完整返回类型为 (),称为 unit(空元组),功能类似于 C/C++ 中的 void。当返回值为 () 时,箭头部分可省略。

第3步:掌握表达式隐式返回

目的:理解 Rust 区别于传统语言的“最后表达式即返回值”特性,减少冗余代码。

  1. 定义带有返回值类型的函数,使用 -> 指定类型。
  2. 移除函数体内的分号,使最后一行成为表达式结果直接返回。
fn main() {
    let x = plus_one(5);
    println!("The value of x is: {}", x);
}

fn plus_one(x: i32) -> i32 {
    x + 1
}

若需满足特定条件提前退出并返回结果,可使用 return 关键字。这通常用于循环或复杂逻辑分支中,以中断当前执行流。

第4步:使用 Return 实现早期退出

目的:在数组查找等场景中,找到目标后立即返回布尔值,避免遍历剩余元素。

  1. 初始化待搜索数组。
  2. 遍历数组元素,匹配成功后立即 return true。
  3. 循环结束后返回默认结果 false。
fn main() {
  let a = [1,3,2,5,9,8];
  println!("There is 7 in the array: {}", find(7, &a));
  println!("There is 8 in the array: {}", find(8, &a));
}
fn find(n: i32, a: &[i32]) -> bool {
  for i in a {
    if *i == n {
      return true;
    }
  }
  false
}

发散函数 (Diverging Function)

发散函数是指那些永远不会正常返回的函数,通常用于表示错误状态导致程序终止。其返回类型标记为感叹号 !。这类函数通常以 panic! 或类似宏调用结束,会强制终止当前线程。

第5步:定义永不返回的逻辑

目的:通过 panic! 模拟业务逻辑无法继续时的崩溃行为。

  1. 使用 -> ! 声明发散函数。
  2. 在函数体内抛出异常 panic!。
fn main() {
  println!("hello");
  diverging();
  // 此行代码因上方 panic 而永远无法执行
  println!("world");
}
fn diverging() -> ! {
  panic!("This function will never return");
}

高阶函数与函数指针

高阶函数允许将其他函数作为参数传入或作为返回值传出。在 Rust 中,这依赖于函数指针类型,由 fn 关键字标识。编译器会在编译期确定其参数和返回值的结构,但不对具体函数体进行内联展开。

第6步:定义和使用函数指针别名

目的:简化复杂函数签名的书写,提高代码可读性。

  1. 使用 type 为特定的函数指针类型创建别名。
  2. 使用别名声明变量,并赋值给具体的函数实例。
type IncType = fn(i32) -> i32;

fn inc(n: i32) -> i32 {
    n + 1
}

fn main() {
    let func: fn(i32) -> i32 = inc;
    println!("3 + 1 = {}", func(3));

    let func_alias: IncType = inc;
    println!("4 + 1 = {}", func_alias(4));
}

第7步:实现函数作为参数的高阶调用

目的:构建通用处理逻辑,根据传入的不同函数对象执行差异化计算。

  1. 定义被调用的基础操作函数(如自增、自减)。
  2. 设计高阶函数 process,接收数据值和函数指针。
  3. 在主函数中动态替换不同的函数指针进行测试。
fn inc(n: i32) -> i32 { n + 1 }
fn dec(n: i32) -> i32 { n - 1 }

fn process(n: i32, func: fn(i32) -> i32) -> i32 {
  func(n)
}

fn main() {
  println!("3 + 1 = {}", process(3, inc));
  println!("3 - 1 = {}", process(3, dec));
}

第8步:实现函数作为返回值的选择器

目的:根据运行时状态动态决定返回何种行为的函数。

  1. 在函数内部定义局部辅助函数 inc 和 dec。
  2. 根据输入数字的奇偶性,返回对应的函数指针。
fn get_func(n: i32) -> fn(i32) -> i32 {
    fn inc(n: i32) -> i32 { n + 1 }
    fn dec(n: i32) -> i32 { n - 1 }
    if n % 2 == 0 { inc } else { dec }
}

fn main() {
    let mut b = Vec::<i32>::new();
    let a = [1,2,3,4,5,6,7];
    for i in &a {
        b.push(get_func(*i)(*i));
    }
    println!("{:?}", b);
}

以上就是 Rust 函数详解:语法、返回值与高阶用法的详细内容,更多关于 Rust 函数教程的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表