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!() 会导致编译失败,并显示出相应的信息。这可以帮助开发者标记哪些部分的代码需要后续实现。
相关推荐
洗澡水加冰15 分钟前
n8n搭建多阶段交互式工作流
后端·llm
陈随易16 分钟前
Univer v0.8.0 发布,开源免费版 Google Sheets
前端·后端·程序员
sduwcgg18 分钟前
python的numpy的MKL加速
开发语言·python·numpy
六月的雨在掘金22 分钟前
通义灵码 2.5 | 一个更懂开发者的 AI 编程助手
后端
钢铁男儿26 分钟前
Python 接口:从协议到抽象基 类(定义并使用一个抽象基类)
开发语言·python
暴力求解39 分钟前
C++类和对象(上)
开发语言·c++·算法
让我们一起加油好吗1 小时前
【基础算法】枚举(普通枚举、二进制枚举)
开发语言·c++·算法·二进制·枚举·位运算
大锦终1 小时前
【C++】特殊类设计
开发语言·c++
朱龙凯1 小时前
MySQL那些事
后端
Re2751 小时前
剖析 MyBatis 延迟加载底层原理(1)
后端·面试