3万网站建设费会计分录,济南酷火网站建设,寻找电商网站建设,网站程序开发的基本步骤文章目录 函数函数中的函数lambda表达式函数作为参数 Rust系列#xff1a;初步⚙所有权⚙结构体和枚举类
函数
先来回顾一下Rust中函数的创建过程#xff0c;在Rust中#xff0c;函数用fn声明#xff0c;如有传入参数或返回值#xff0c;都需要声明数据类型#xff0c;… 文章目录 函数函数中的函数lambda表达式函数作为参数 Rust系列初步⚙所有权⚙结构体和枚举类
函数
先来回顾一下Rust中函数的创建过程在Rust中函数用fn声明如有传入参数或返回值都需要声明数据类型下面是一个质朴的阶乘函数
可以写一个阶乘函数
fn fac(x:i32)-i32{if x1{return x*fac(x-1);}else{return 1;}
}fn main(){let x fac(5);println!(5!{},x);
}测试为
rustc main.rs
main.exe
5!120函数中的函数
Rust中的函数并不支持传入任意参数如果非要这么干那么需要用宏来假装实现故而就等到介绍宏的时候再说。
但Rust提供了一些函数式特性首先支持在函数中再定义一个函数示例如下
//lambda.rs
fn closure_test_1(){fn add(a:i32, b:i32) - i32 {a b}println!(34{}, add(3,4));
}
fn main(){closure_test_1();
}测试结果如下
rustc lambda.rs
lambda.exe
347lambda表达式
函数式编程的一大优势就是把函数当作变量那么既然是变量就应该可以用let绑定而想用let绑定就必须通过赋值好把函数名和函数内容分开这就是lambda表达式
Rust中的lambda表达式从写法上来说就是用两个竖线代替函数的括号总共有四种写法示例如下
fn closure_test_2(){let add |a:f32, b:f32| - f32{ab};let minus |a,b| {a-b};let mul |a, b| a*b;let div move |a,b| a/b;println!(add(3,4){}, add(3.0,4.0));println!(minus(3,4){}, minus(3.0,4.0));println!(mul(3,4){}, mul(3.0,4.0));println!(div(3,4){}, div(3.0,4.0));
}
fn main(){closure_test_2();
}其中add是比较完整的写法minus则是简化版本并且开启了类型判断mul进一步简化省略了花括号div则使用了move关键字其功能是强制闭包取得被捕获变量的所有权。
运行结果如下
add(3,4)7
minus(3,4)-1
mul(3,4)12
div(3,4)0.75函数作为参数
为了明白我们要干什么下面举一个最简单的示例新建一个fun_test这个函数有三个参数前两个参数是整数第三个参数是一个可以调用两个参数的函数示例如下
fn fun_test(v1: i32, v2: i32, f: dyn Fn(i32, i32) - i32){println!({}, f(v1, v2));
}fn main() {let mul |a, b| a*b;println!(5x8);fun_test(5, 8, mul);
}上述代码有个值得注意的地方首先fun_test第三个参数的类型为dyn Fn(i32, i32)-i32即这是个Fn类型的函数并且用到了取地址符并且用到了trait前缀dyn。相应地在调用fun_test时其传入参数mul也用到了取地址符。
测试结果如下
lambda.exe
5x840Rust中提供了三种作为参数的函数类型其限制如下
Fn不能修改捕获的对象。FnMut可以修改捕获的对象。FnOnce只能调用一次