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

本文详细讲解了Rust中的函数别名与高阶函数,包括函数指针类型定义、函数作为参数的operation与operation_alias示例,以及函数作为返回值的get_operation和get_operation_alias案例。提升代码可读性的技巧不容错过。
摘要由CSDN通过智能技术生成

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 = 3
b = 4.5
c = 134.6753453424234
d = '我'

上面的代码可以看到,咱们把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 = 8
mul_result = 15

代码解释:

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

main函数中,分别调用operation_aliasoperation方法,计算ab的值。

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 = 10
mul_result = 24

代码解释:

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

main函数中,分别调用get_operation_aliasget_operation方法,计算ab的值。

0x04 小结

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

0x04 本节源码

019 · StudyRust - 码云 - 开源中国 (gitee.com)

下节预告—— 闭包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uuuhhhyyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值