考虑这个 C++ 代码:
#include <iostream>
#include <functional>
using namespace std;
std::function<int(int, int)> foo(int c) {
auto add = [] (int a, int b) { return a + b; };
auto sub = [] (int a, int b) { return a - b; };
if (c > 42) {
return add;
} else {
return sub;
}
}
int main() {
cout << foo(100)(10, 20) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
两个 lambdas (add和sub) 都通过类型擦除std::function,然后在 main 中调用该函数。我想知道如何在 Rust 中复制这种模式?
您的示例的一个相当准确的翻译将是以下片段。
fn foo(c: i32) -> Box<dyn Fn(i32, i32) -> i32> {
let add = |a, b| a + b;
let sub = |a, b| a - b;
Box::new(if c > 42 { add } else { sub })
}
fn main() {
println!("{}", foo(100)(10, 20));
}
Run Code Online (Sandbox Code Playgroud)
一种类型的闭包是不可命名的,因此我们将其强制为 trait 对象并将其存储在堆上,据我所知,这与此大致相同std::function。