【RUST学习日记】第18课 函数(一)

简介: 【RUST学习日记】第18课 函数(一)

0x00 回顾与开篇


最近加班比较严重,工作繁忙,公众号停更了好久,望大家见谅!!


上节介绍了Rust的流程控制,了解了if和while的用法。从这一节课开始咱们进入函数的学习。函数是程序执行的最基本结构,咱们最常见的函数就是main函数了。从开始接触Rust这门语言,main函数就伴随着咱们了。


0x01 定义函数


在写代码的时候,不可避免会产生很多重复的代码。这个时候可以将这些重复代码定义成一个函数。定义函数使用fn关键字,其后面紧跟函数名称,函数名称通常以蛇形命名法(snake_case)。函数如果有参数,必须为其指定类型。如果函数存在返回值,也应该为其指定类型。当然,函数的参数和返回值都不是必须的。函数的声明可以在main函数后面。下面是一个完整的函数表现形式。

fn function_name(parameter: T) -> N {
}

下面通过一个示例来了解下函数。编写一个计算两个整数加法的函数。

示例代码如下:

fn main() {
    let a = 5;
    let b = 3;
    let c = add(a, b);
    println!("a + b = {}", c);
}
/// 计算两个数的加法
fn add(a: i32, b: i32) -> i32 {
    return a + b;
}

代码运行结果:

a + b = 8

函数参数如果需要可变操作时,可以添加mut关键字,如:mut a: i32。函数如果存在多个参数,则需要通过逗号分隔。当函数需要返回值时,必须明确返回值类型,且在函数签名后面添加->符号,其后紧跟函数返回值类型。


PS:Rust中所有的函数都存在返回值,如果没有显示的明确函数的返回值,也会隐式的返回一个单元值()。


示例代码如下:

fn main() {
    let d = empty_no_return();
    dbg!(d);
}
/// 空函数,无返回值
fn empty_no_return() {
}

代码运行结果:

d = ()


0x02 高阶函数——函数指针


高阶函数就是指以函数为参数或返回值的函数,是函数式编程语言的基础特性。将函数作为一种类型,既可以被调用,也可以作为参数,又可以作为返回值。实现这些操作的基础就是函数指针,函数指针使用fn()来指定。


顾名思义,函数指针就表示是指向函数的指针,它的值就是函数的地址啦。下面看一个例子:


fn say_hello() {
    println!("hello!")
}
fn main() {
    // 函数赋值,声明类型
    let say_hello_ptr: fn() = say_hello;
    say_hello_ptr();
    // 函数赋值,类型推断
    let other_say_hello_ptr= say_hello;
    other_say_hello_ptr();
    // 原函数调用
    say_hello()
}

代码运行结果:


hello!
hello!
hello!

我来解释下上面的代码吧。首先创建了一个say_hello()函数。然后在main()函数中声明了两个函数变量分别是say_hello_ptrother_say_hello_ptr。然后分别输出。当然函数赋值时,支持类型推断。另外,虽然函数可以赋值给其它变量,但是原函数仍然可以被调用,且函数可以同时赋值给多个变量。

PS:函数赋值时,在等号右边只有函数名,不带有()


0x03 小结


本节简单介绍了Rust的函数,对函数有一个初步的了解。下节继续讲解函数的另外两种用法:函数作为参数和函数作为返回值。

相关文章
|
4天前
|
Rust 算法 安全
学习Rust
【10月更文挑战第13天】学习Rust
28 8
|
5天前
|
Rust 安全 算法
Rust的学习
【10月更文挑战第12天】Rust的学习
13 2
|
5天前
|
Rust 算法 安全
如何学习Rust编程?
【10月更文挑战第12天】如何学习Rust编程?
17 1
|
17天前
|
Rust API
【Rust学习】09_方法语法
结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,允许您指定结构体的实例具有的行为。 但是结构体并不是创建自定义类型的唯一方式:让我们转向 Rust 的 enum 功能,将另一个工具添加到你的工具箱中。
10 0
|
1月前
|
Rust 索引
【Rust学习】08_使用结构体代码示例
为了了解我们何时可能想要使用结构体,让我们编写一个计算长方形面积的程序。我们将从使用单个变量开始,然后重构程序,直到我们改用结构体。
72 2
|
1月前
|
存储 Rust 编译器
【Rust学习】07_结构体说明
**struct**或 ***structure***是一种自定义数据类型,允许您命名和包装多个相关的值,从而形成一个有意义的组合。如果您熟悉面向对象的语言,那么**struct**就像对象中的数据属性。在本章中,我们将比较和对比元组与结构体,在您已经知道的基础上,来演示结构体是对数据进行分组的更好方法。
21 1
|
2月前
|
存储 Rust 编译器
30天拿下Rust之函数详解
在Rust中,函数是程序的基本构建块,是代码复用的基本单位,用于封装一系列执行特定操作和计算的语句。函数是可重用的代码片段,可以接受输入参数并产生输出。通过合理使用函数,可以提高代码的可读性、可维护性和可重用性。
42 4
|
1月前
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习
|
2月前
|
存储 Rust 安全
【Rust学习】06_切片
所有权、借用和切片的概念确保了 Rust 程序在编译时的内存安全。Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码。
21 1
|
3月前
|
Rust 编译器
【Rust学习】05_引用和借用
在这章我们将开始学习Rust的引用和借用,它们是Rust中重要的概念,它们允许我们创建可变引用,以及创建不可变引用。
22 0