Rust(22):高阶函数和发散函数
今天学习的内容是 Rust 中的高阶函数和发散函数。
高阶函数
高阶函数属于函数式编程中的一个非常重要的概念。
在数学和计算机科学中,高级函数是至少满足下列一个条件之一的函数:
- 接受一个或者多个函数作为输入
- 输出一个函数
说白了就是一个函数的参数是函数,或者返回值是函数,它就是高阶函数。
在数学中它们也叫算子(运算符)或泛函。
Rust 具备函数式编程的特性,其表现之一就是有高阶函数。这一点和 JS 非常像。
将函数作为参数传递
定义了一个计算方法,传入运算方法和参数,进行运算。又定义了一个加法函数和一个减法函数。
// type 是类型别名,方便复用类型
type Method = fn(u32, u32) -> u32;
fn calc(method: Method, a: u32, b: u32) -> u32 {
method(a, b)
}
fn add(a: u32, b: u32) -> u32 {
a + b
}
fn sub(a: u32, b: u32) -> u32 {
a - b
}
fn main() {
println!("{}", calc(add, 10, 20));
println!("{}", calc(sub, 20, 10));
}
返回一个函数
type Method = fn(u32, u32) -> u32;
fn calc(method: &str) -> Method {
match method {
"add" => add,
"sub" => sub,
_ => unimplemented!()
}
}
fn add(a: u32, b: u32) -> u32 {
a + b
}
fn sub(a: u32, b: u32) -> u32 {
a - b
}
fn main() {
println!("{}", calc("add")(10, 20));
println!("{}", calc("sub")(20, 10));
}
发散函数
发散函数永远不会被返回,其返回值被标记为 !
,这是一个空类型:
fn foo() ->!{
panic!("这个函数调用永远没有返回");
}
panic!
宏会终止程序的执行,所以该函数没有返回。
发散函数和空返回值函数不同,后者可以被返回:
fn bar() {
()
}
fn main() {
let a:() = bar();
println!("在此可以看到函数 bar 的返回 ");
}
发散函数最大的用处就是用来通过 Rust 的类型检查。比如前面介绍 if
表达式时说过,如果存在多个条件分支,那么每个分支返回值的类型都要保持一致。可以使用发散函数调用的结果作为分支的返回,可以通过 Rust 的类型检查而不报错:
fn foo() ->!{
panic!("这个函数调用永远没有返回");
}
fn main() {
let a = if true {
10
} else {
foo()
}
println!("{}", a);
}
发散函数基本上是用不到的,如果用到了,可以重新审视下代码,应该有更好的写法。
小结
高级函数是函数式编程的重要概念,可以尝试在 Rust 中使用函数式编程去完成功能开发。后面学到 Rust 的面向对象思想的应用,到时候可以将两种编程范式进行一个比较。
转载自:https://juejin.cn/post/7157556585068232734