繁体   English   中英

如果捕获变量,如何将闭包作为 function 参数传递

[英]How to pass a closure as a function parameter if it captures variables

我正在尝试使用 Rust 中的高阶函数。我很挣扎,因为我想传递的参数 function 是一个捕获值的闭包。

这是我的第一次尝试( 游乐场链接):

/// 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));
}

这也无法编译,并出现与生命周期相关的错误,即“cast requires that dynamic_value is borrowed for 'static ”。 我想它正在谈论的演员表是将我的闭包封装到特征 object 中吗?

我该怎么做才能使此代码正常工作?

使用 Fn-traits!

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM