首页 > 解决方案 > 返回闭包但不能推断类型

问题描述

在学习 rust闭包时,我尝试 Like Java return "A Function"

fn equal_5<T>() -> T
    where T: Fn(u32) -> bool {
    let x:u32 = 5;
    |z| z == x
}

但是当我使用它时

let compare = equal_5();
println!("eq {}", compare(6));

构建错误

11 |     let compare = equal_5();
   |         ------- consider giving `compare` a type
12 |     println!("eq {}", compare(6));
   |                       ^^^^^^^^^^ cannot infer type
   |
   = note: type must be known at this point

标签: rustclosures

解决方案


见:https ://doc.rust-lang.org/stable/rust-by-example/trait/impl_trait.html

目前T描述了一种类型,在这种情况下实现了Fntrait。换句话说,T不是一个具体的类型。事实上,对于闭包,不可能声明一个具体的类型,因为每个闭包都有自己唯一的类型(即使两个闭包完全相同,它们也有不同的类型。)

为了绕过直接声明闭包的类型(这是不可能的),我们可以使用impl关键字。impl 关键字所做的是将我们对类型(特征边界)的描述转换为适合这些边界的不可见具体类型。

所以这有效:

fn equal_5() -> impl Fn(u32) -> bool {
    let x:u32 = 5;
    move |z| z == x
}

let compare = equal_5();
println!("eq {}", compare(6));

需要注意的一件事是我们也可以动态地执行此操作。使用盒子和dyn特征。所以这也有效,但是会产生动态分辨率的相关成本。

fn equal_5() -> Box<dyn Fn(u32) -> bool> {
    let x:u32 = 5;
    Box::new(move |z| z == x)
}

let compare = equal_5();
println!("eq {}", compare(6));

推荐阅读