rust - 返回闭包但不能推断类型
问题描述
在学习 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
解决方案
见:https ://doc.rust-lang.org/stable/rust-by-example/trait/impl_trait.html
目前T
只描述了一种类型,在这种情况下实现了Fn
trait。换句话说,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));
推荐阅读
- python - keras model.evaluate 似乎没有使用权重
- python - 如何将数据框行拆分为多个数据框?
- php - 从数据库通过连接到 REST 它是如何工作的?
- javascript - 如何从事件监听回调函数访问 vue3 方法
- python - 使用 Python 访问 Interactive brokers Risk Navigator
- mongodb - 什么是mongodb状态中的内存以及如何减少它
- java - 如何判断当前线程是否是事件调度thead
- python - Hydra runtime type checking does not work when config name specified in command line
- google-cloud-platform - Linking to Google Cloud Storage files with automatic authentication
- python - 编码逻辑(Python)