【RUST学习日记】第19课 函数(二)

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

0x00 回顾与开篇


上一篇文章初步了解了Rust的函数,这节课继续介绍Rust的高阶函数——函数作为参数和函数作为返回值的两种形式。


0x01 type定义别名


在Rust中,我们可以使用type关键字来为Rust的原始类型或者自定义类型定义别名。

示例代码如下:

type Int = i32;
    type Float = f32;
    type Double = f64;
    type Char = char;
    let a: Int = 3;
    let b: Float = 4.5;
    let c: Double = 134.6753453424234231;
    let d: Char = '我';
    dbg!(a);
    dbg!(b);
    dbg!(c);
    dbg!(d);

代码运行结果:

a = 3b = 4.5c = 134.6753453424234d = '我'

上面的代码可以看到,咱们把i32类型定义别名为Int类型,f32类型定义别名为Float类型,f64类型定义别名为Double类型,char类型定义别名为Char类型。


0x02 函数作为参数


当Rust的函数作为参数时,建议使用type关键字为函数指针类型定义别名。其目的是为了提升代码的可读性。下面我通过一个例子讲解将函数作为参数的例子。

/// 函数声明别名type Calc = fn(i32, i32) -> i32;/// 操作运算(别名)fn operation_alias(calc: Calc, a: i32, b: i32) -> i32 {
    return calc(a, b);}/// 操作运算fn operation(calc: fn(i32, i32) -> i32, a: i32, b: i32) -> i32 {
    return calc(a, b);}/// 加法fn add(a: i32, b: i32) -> i32 {
    return a + b;}/// 乘法fn mul(a: i32, b: i32) -> i32 {
    return a * b;}fn main() {
    let a = 5;
    let b = 3;
    let add_result = operation_alias(add, a, b);
    let mul_result = operation(mul, a, b);
    dbg!(add_result);
    dbg!(mul_result);}

代码运行结果:

add_result = 8mul_result = 15

代码解释:


首先,使用type关键字为函数指针类型fn(i32,i32)->i32起一个别名为Calc。然后又定义了一个函数operation_alias,它有三个参数,其中第一个参数为Calc类型,第二个和第三个参数是i32类型。紧接着又定义了一个函数operation,它也有三个参数,与operation_alias一样。不同的是,operation的第一个参数没有使用别名,而是使用了原始的函数指针类型,在可读性上可能比较差。最后按照fn(i32,i32)->i32形式,分别定义了add和mul函数来计算加法和乘法。


main函数中,分别调用operation_alias和operation方法,计算a和b的值。


0x03 函数作为返回值


当Rust的函数作为返回值时,建议使用type关键字为函数指针类型定义别名。其目的是为了提升代码的可读性。下面我通过一个例子讲解将函数作为返回值的例子。

/// 函数声明别名type Calc = fn(i32, i32) -> i32;/// 根据字符串获取函数(别名)fn get_operation_alias(s: &str) -> Calc {
    if s == "add" {
        add    } else {
        mul    }}/// 根据字符串获取函数fn get_operation(s: &str) -> fn(i32, i32) -> i32 {
    if s == "add" {
        add    } else {
        mul    }}/// 加法fn add(a: i32, b: i32) -> i32 {
    return a + b;}/// 乘法fn mul(a: i32, b: i32) -> i32 {
    return a * b;}fn main() {
    let a = 4;
    let b = 6;
    let add_result = get_operation_alias("add")(a, b);
    let mul_result = get_operation("mul")(a, b);
    dbg!(add_result);
    dbg!(mul_result);}

代码运行结果:

add_result = 10mul_result = 24

代码解释:

首先,使用type关键字为函数指针类型fn(i32,i32)->i32起一个别名为Calc。然后又定义了一个函数get_operation_alias,它只有一个参数,根据参数返回指定的函数。紧接着又定义了一个函数get_operation,它也只有一个参数,与get_operation_alias一样。不同的是,get_operation的返回值使用了原始的函数指针类型,在可读性上可能比较差。最后按照fn(i32,i32)->i32形式,分别定义了add和mul函数来计算加法和乘法。

main函数中,分别调用get_operation_alias和get_operation方法,计算a和b的值。


0x04 小结


本节介绍了Rust高阶函数的两种形式——函数作为参数和函数作为返回值。当函数作为参数或者作为返回值时,建议使用type类型定义别名。

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