我开始在闭包上阅读Rust guide。从指南:
这是因为在Rust中,每个闭包都有自己独特的类型。因此,具有不同签名的闭包不仅具有不同的类型,而且具有相同签名的不同闭包具有不同的类型。
有没有办法明确写出闭包的类型签名?是否有任何编译器标志可以扩展推断闭包的类型?
答案 0 :(得分:4)
没有。闭包的实际类型只有编译器知道,并且实际上对于能够知道给定闭包的具体类型并不是很有用。您可以指定某些"形状"但是,闭包必须适合:
fn call_it<F>(f: F)
where
F: Fn(u8) -> u8, // <--- HERE
{
println!("The result is {}", f(42))
}
fn main() {
call_it(|a| a + 1);
}
在这种情况下,我们说call_it
接受任何实现特征Fn
的类型,其中一个参数类型为u8
,返回类型为u8
。然而,许多闭包和自由函数可以实现该特性。
从Rust 1.26.0开始,您还可以使用impl Trait
语法接受或返回闭包(或任何其他特征):
fn make_it() -> impl Fn(u8) -> u8 {
|a| a + 1
}
fn call_it(f: impl Fn(u8) -> u8) {
println!("The result is {}", f(42))
}
fn main() {
call_it(make_it());
}