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!() 会导致编译失败,并显示出相应的信息。这可以帮助开发者标记哪些部分的代码需要后续实现。
相关推荐
系统集成-鹰翔6 分钟前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
octopus_c19 分钟前
C++ 运算符重载详解 && 日期类的实现
开发语言·c++
Eiceblue23 分钟前
用 Python 给 Word 文档加水印:文字、图片与批量处理
开发语言·vscode·python·word
j7~27 分钟前
【C++ 面试笔记】(篇二):类与数据抽象 & STL 容器与算法
开发语言·c++·面试·stl容器和算法·类和数据抽象
Fuyo_11191 小时前
深入解析 C++ unordered_set 与 unordered_map 的核心特性与性能实战
开发语言·c++
软件技术NINI1 小时前
基于SpringBoot和Vue的摇滚乐鉴赏网站
vue.js·spring boot·后端·spring·html·毕业设计·毕设
ShineWinsu1 小时前
对于Qt:QPushButton常见属性的解析
开发语言·c++·qt·api·gui·按钮·qpushbutton
外贸GEO优化1 小时前
外贸独立站的可抓取性:JS 渲染、懒加载与无限滚动到底影响什么
开发语言·javascript·ecmascript
飞浪纪元[FWC–FE]1 小时前
Qt 工程创建与 CMake / qmake 构建规范
开发语言·数据库·qt