首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有任何方法显式地编写闭包的类型?

是否有任何方法显式地编写闭包的类型?
EN

Stack Overflow用户
提问于 2015-03-22 04:58:49
回答 2查看 857关注 0票数 7

我开始阅读关于闭包的锈蚀导轨。从指南中:

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

是否有一种方法显式地写入闭包的类型签名?是否有任何编译器标志可以扩展推断的闭包类型?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-22 05:06:14

不是的。真正的闭包类型只有编译器才知道,而能够知道给定闭包的具体类型实际上并没有多大用处。但是,您可以指定闭包必须适合的某些“形状”:

代码语言:javascript
运行
复制
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语法接受或返回闭包(或任何其他特征):

代码语言:javascript
运行
复制
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());
}
票数 7
EN

Stack Overflow用户

发布于 2022-06-29 03:51:09

引用该引用时,“闭包表达式产生的闭包值具有唯一的匿名类型,不能写入”。

但是,闭包可以强制到函数指针。

代码语言:javascript
运行
复制
let trim_lines: fn((usize, &str)) -> (usize, &str) = |(i, line)| (i, line.trim());

函数指针可以像常规函数一样在.map().filter()等中使用。类型将不同,但返回的值将显示Iterator特征。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29191170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档