rust - 如果闭包捕获变量,如何将其作为函数参数传递

标签 rust higher-order-functions

我正在尝试使用 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/

相关文章:

javascript - ReactJS,渲染后重定向

javascript - 如何动态地将参数从高阶函数传递到回调函数?

rust - 如何在Rust的子过程中准备stdout/stderr

rust - 通过列表向后循环时在 'attempt to subtract with overflow' 出现 panic

rust - 如何通过引用传递拥有的数组

c++ - 为什么我的 std::ref 不能按预期工作?

rust - 如何在转换为 trait 对象时使用 Rc::clone?

optimization - 我可以在 Rust 中按值有效地返回对象吗?

c# - Functional C# - 使用或返回 Action 的

javascript - 实现一个名为 `processLastItem` 的高阶函数