簡體   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