fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 { // definition
f(arg) + f(arg)
}
do_twice(|x| x + 1, 5) // call
Run Code Online (Sandbox Code Playgroud)
该函数接受闭包和函数指针.它将函数指针作为参数类型.
什么时候我应该更喜欢使用特征对象,比如&dyn Fn(i32) -> i32或Box<dyn Fn(i32)-> i32>代替fn
fn do_twice(f: &dyn Fn(i32) -> i32, arg: i32) -> i32 { // definition
f(arg) + f(arg)
}
do_twice(&|x| x + 1, 5) // call
Run Code Online (Sandbox Code Playgroud)
要么
fn do_twice(f: Box<dyn Fn(i32) -> i32>, arg: i32) -> i32 { // definition
f(arg) + f(arg)
}
Run Code Online (Sandbox Code Playgroud)