我开始阅读关于闭包的锈蚀导轨。从指南中:
这是因为在Rust中,每个闭包都有其独特的类型。因此,不同签名的闭包不仅有不同的类型,而且具有相同签名的不同闭包也有不同的类型。
是否有一种方法显式地写入闭包的类型签名?是否有任何编译器标志可以扩展推断的闭包类型?
发布于 2015-03-22 05:06:14
不是的。真正的闭包类型只有编译器才知道,而能够知道给定闭包的具体类型实际上并没有多大用处。但是,您可以指定闭包必须适合的某些“形状”:
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接受任何使用u8类型的参数和返回类型的u8实现特征Fn的类型。然而,许多闭包和空闲函数都可以实现这一特性。
从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());
}发布于 2022-06-29 03:51:09
引用该引用时,“闭包表达式产生的闭包值具有唯一的匿名类型,不能写入”。
但是,闭包可以强制到函数指针。
let trim_lines: fn((usize, &str)) -> (usize, &str) = |(i, line)| (i, line.trim());函数指针可以像常规函数一样在.map()、.filter()等中使用。类型将不同,但返回的值将显示Iterator特征。
https://stackoverflow.com/questions/29191170
复制相似问题