我正在尝试使用 Rust 中的高阶函数。我很挣扎,因为我想要传递的参数函数是一个捕获值的闭包。
这是我的第一次尝试(playground link):
/// Takes a value, n, doubles it, and then applies the function f
fn double_then_f(n:u64, f: fn(u64) -> u64) -> u64 {
f(n * 2)
}
fn main() {
// Simple f closure works just fine
let example_1 = double_then_f(5, |n| n + 1);
// More realistic closure doesn't work
let dynamic_value = vec![1, 2, 3].iter().sum::<u64>();
let example_2 = double_then_f(5, |n| n + dynamic_value);
}
编译失败
note: expected fn pointer `fn(u64) -> u64`
found closure `[closure@src/main.rs:12:38: 12:41]`
note: closures can only be coerced to `fn` types if they do not capture any variables
在阅读了 Fn
特征和 fn
类型之间的区别之后,这是我的第二次尝试:
/// Takes a value, n, doubles it, and then applies the function f
fn double_then_f(n:u64, f: Box<dyn Fn(u64) -> u64>) -> u64 {
f(n * 2)
}
fn main() {
// Simple f closure works just fine
let example_1 = double_then_f(5, Box::new(|n| n + 1));
// More realistic closure doesn't work
let dynamic_value = vec![1, 2, 3].iter().sum::<u64>();
let example_2 = double_then_f(5, Box::new(|n| n + dynamic_value));
}
这也无法编译,并出现与生命周期相关的错误,指出“强制转换要求 dynamic_value
被借用于 'static
”。我猜它所说的转换是将我的闭包封装到一个特征对象中?
我该怎么做才能使这段代码正常工作?
最佳答案
使用 Fn 特征!
fn double_then_f<F: Fn(u64) -> u64>(n:u64, f: F) -> u64 {
f(n * 2)
}
fn main() {
let example_1 = double_then_f(5, |n| n + 1);
let dynamic_value = vec![1, 2, 3].iter().sum::<u64>();
let example_2 = double_then_f(5, |n| n + dynamic_value);
}
关于rust - 如果闭包捕获变量,如何将其作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74762476/