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!() 会导致编译失败,并显示出相应的信息。这可以帮助开发者标记哪些部分的代码需要后续实现。
相关推荐
蝎子莱莱爱打怪7 分钟前
XZLL-IM干货系列 04|Netty 长连接实战:Pipeline 怎么排、心跳怎么跳、连接怎么管
后端·微服务·面试
Csvn13 分钟前
Rsync 文件同步与增量备份 — 运维的数据守门员
后端
苏三说技术15 分钟前
推荐一个牛逼的智能代码审查系统
后端
倾颜23 分钟前
从 GitHub Actions 到本地兜底发布:AI Mind 容器化上线的一次真实收口
后端
像我这样帅的人丶你还30 分钟前
Java 后端详解(二):注解、参数绑定、评论与用户认证
后端
用户7623524259131 分钟前
深入理解AQS之独占锁ReentrantLock
后端
用户7623524259138 分钟前
理解 CAS & Atomic 原子操作类
后端
SimonKing1 小时前
铁子,IntelliJ IDEA 2026.1.3来了,升不升?
java·后端·程序员
铁皮饭盒1 小时前
@kognitivedev/rag, 用js做AI Agent开发
javascript·后端
IT_陈寒1 小时前
JavaScript的默认参数挖坑实录,我掉进去了
前端·人工智能·后端