有没有办法明确写出闭包的类型?

时间:2015-03-22 04:58:50

标签: closures rust

我开始在闭包上阅读Rust guide。从指南:

  

这是因为在Rust中,每个闭包都有自己独特的类型。因此,具有不同签名的闭包不仅具有不同的类型,而且具有相同签名的不同闭包具有不同的类型。

有没有办法明确写出闭包的类型签名?是否有任何编译器标志可以扩展推断闭包的类型?

1 个答案:

答案 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());
}