很容易将内部闭合包装在Box
中:
fn add1() -> impl Fn(i32) -> Box<Fn(i32) -> i32> {
|x| Box::new(|y| x + y)
}
但是是否有必要使用Box
?在以下代码中:
fn add2() -> ?? {
|x: i32| move |y: i32| x + y
}
我可以用一些东西代替??
来检查代码类型吗?
答案 0 :(得分:3)
不。如您所知,impl Trait
是一种无需装箱即可返回特征实例的机制。
如果您尝试扩展此范围:
fn add2() -> impl Fn(i32) -> impl Fn(i32) -> i32 {
|x| |y| x + y
}
编译器告诉您:
error[E0562]: `impl Trait` not allowed outside of function and inherent method return types
--> src/lib.rs:9:30
|
9 | fn add2() -> impl Fn(i32) -> impl Fn(i32) -> i32 {
| ^^^^^^^^^^^^^^^^^^^
根据impl Trait
RFC,重点是我的:
impl Trait
只能写在 独立的或固有的隐式函数,不在特征定义或 任何单向型位置。它们也可能不会出现在退货中 封闭特征或函数指针的类型,除非这些是 本身就是合法退货类型的一部分。
- 最终,我们将希望允许在特征中使用该功能
闭包的返回类型是闭包特征的关联类型:
pub trait FnOnce<Args> {
type Output;
extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
}
另请参阅: