[英]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.