Rust 圣经 阅读 函数

函数要点

  • 函数名和变量名使用 蛇形命名法(snake case),例如 fn add_two() -> () {}
  • 函数可以放在任何位置。
  • 每个函数参数都需要标注类型。

函数参数

Rust 是强类型语言,因此需要为每个函数参数都标识出它的具体类型。

缺少任何一个参数的类型,都会报错。

函数返回

函数的返回值就是最后一条表达式的返回值。

但也可以使用 return 来提前返回。

函数需要手动指明返回值的类型,不然会默认返回的 (),会出现返回的类型与指定的类型不一致的错误。

rust 复制代码
fn plus_five(x:i32) -> i32 {
    x + 5
}

fn main() {
    let x = plus_five(5);

    println!("The value of x is: {}", x);
}
rust 复制代码
fn plus_or_minus(x:i32) -> i32 {
    if x > 5 {
        return x - 5
    }

    x + 5
}

fn main() {
    let x = plus_or_minus(5);

    println!("The value of x is: {}", x);
}

特殊返回类型

当一个函数没有返回值时,返回单元类型 ()

  • 函数没有返回值,那么返回一个 ()
  • 通过 ; 结尾的表达式返回一个 ()
rust 复制代码
use std::fmt::Debug;

fn report<T: Debug>(item: T) {
  println!("{:?}", item);
// 会隐式地返回一个 ()
}

永不返回的发散函数 !

当使用 ! 作为函数的返回类型的时候,表示该函数永不返回(diverge function)。

在Rust中,发散函数(diverging function)指的是一个永远不会返回的函数。这意味着一旦调用发散函数,程序就会立刻终止或进入无限循环,而不会返回到调用的位置。发散函数主要有两个作用:

  1. 在编译时表明该函数永远不会返回,这对于编译器的优化和检查非常有用。例如,当编写一个 panic 的宏时,可以将该宏标记为发散函数,这样编译器就知道在宏的调用之后不需要继续进行代码分析。
  2. 在某些情况下,显式表明函数的发散性质可以增加程序的可读性。例如,在Rust中,panic! 宏就是一个发散函数,当出现严重错误时,调用 panic! 可以立即终止程序并打印错误信息。

这种语法往往用做会导致程序崩溃的函数:

rust 复制代码
fn dead_end() -> ! {
  panic!("你已经到了穷途末路,崩溃吧!");
}

没弄懂 发散函数 的作用。

  • panic!(): 这是Rust中的一个宏,用于表示程序发生严重错误并且需要立即终止的情况。当调用 panic!() 时,程序将会立即停止执行,并打印出错误消息。这通常用于处理无法恢复的错误或者在开发阶段的临时调试目的。
  • todo!():这也是Rust中的一个宏,用于标记代码中需要未来实现的部分。当调用 todo!() 时,程序会编译失败并显示一条信息,提示开发者有未完成的工作。这可以帮助团队协作和开发过程中的任务管理。
  • loop {std::thread::sleep(std::time::Duration::from_secs(1))}:这是一个循环语句,其目的是在程序中创建一个无限循环。通常情况下,这样的循环用于执行某些需要持续运行的任务,比如定时任务或者事件轮询。
  • unimplemented!():这同样是Rust中的一个宏,用于表示代码中的某些功能尚未实现。与 todo!() 类似,调用 unimplemented!() 会导致编译失败,并显示出相应的信息。这可以帮助开发者标记哪些部分的代码需要后续实现。
相关推荐
tobebetter95273 小时前
How to manage python versions on windows
开发语言·windows·python
Y***h1874 小时前
第二章 Spring中的Bean
java·后端·spring
9***P3344 小时前
PHP代码覆盖率
开发语言·php·代码覆盖率
CoderYanger4 小时前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
jllllyuz5 小时前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab
稚辉君.MCA_P8_Java5 小时前
DeepSeek 插入排序
linux·后端·算法·架构·排序算法
多多*5 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
t***p9355 小时前
idea创建SpringBoot自动创建Lombok无效果(解决)
spring boot·后端·intellij-idea
d***81725 小时前
解决SpringBoot项目启动错误:找不到或无法加载主类
java·spring boot·后端
p***43485 小时前
Rust网络编程模型
开发语言·网络·rust