函数指针

  1. 函数指针被允许使用函数作为另一个函数的参数,函数的类型是fn,fn就是一种函数指针,
    指定参数为函数指针的语法类似闭包
  2. 函数指针实现了闭包的三个特征:Fn、FnMut、FnOnce,因此,可以在闭包中调用函数指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
fn add_one(x: i32) -> i32 {
x + 1
}
fn do_twice(f: fn(i32) -> i32,val: i32) -> i32 {//第一个参数是一个函数指针,类型是
//参数为i32,返回值为i32的函数
f(val)+ f(val)
}
fn wapper_func<T>(t: T,v: i32) -> i32
where T: Fn(i32) -> i32 {//T类型必须实现Fn特征
t(v)

}
fn fnc(v: i32) -> i32 {
v + 1
}
fn main() {
let r = do_twice(add_one,5); //12
println!("r = {}",r);

//+++++++++++
let a = wapper_func(|x| x+1,1);
println!("a = {}",a);

let b = wapper_func(fnc,1);
println!("b = {}",b);
}

函数参数返回闭包

1
2
3
4
5
6
7
8
9
10
//fn return_clo() -> Fn(i32) -> i32 {//大小未知,使用指针,返回特征对象
fn return_clo() -> Box<dyn Fn<i32>->i32> {
Box::new(|x| x+1)
}
fn main() {
let c = return_clo();
println!("1 + 1 ={}",c(1));
//等价于
println!("1+ 1 = {}",(*c)(1));
}