【Rust自学】13.2. 闭包 Pt.2:闭包的类型推断和标注

发布时间:2026/11/8 18:39:09

【Rust自学】13.2. 闭包 Pt.2:闭包的类型推断和标注 13.2 闭包 Pt.2闭包的类型推断和标注13.2.0. 写在正文之前Rust语言在设计过程中受到了很多语言的启发而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。在本章中我们会讨论 Rust 的一些特性这些特性与许多语言中通常称为函数式的特性相似-闭包本文- 迭代器- 使用闭包和迭代器改进I/O项目- 闭包和迭代器的性能13.2.1. 闭包的类型推断和fn定义的函数不同闭包不强制要求标注参数和返回值的类型。函数需要强制标注是因为它是暴露给用户的显示接口的一部分严格定义接口有助于所有人对参数和返回值的类型取得共识。闭包并不会被用于这样的暴露接口只会被存于变量中使用时也不需要命名更不会被暴露给我们代码库的用户。所以闭包不强制要求标注参数和返回值的类型。而且闭包通常很短小只在狭小的上下文中工作编译器通常能推断出类型。当然你手动标注出来也不是不可以。看个例子这是使用函数定义的代码fn simulated_expensive_calculation(intensity: u32) - u32 { println!(calculating slowly...); thread::sleep(Duration::from_secs(2)); intensity }这是使用闭包的代码let expensive_closure |num:u32| - u32 { println!(calculating slowly...); thread::sleep(Duration::from_secs(2)); num };这里使用显式标注是因为没有前后文供Rust推断类型如果有就不需要fn generate_workout(intensity: u32, random_number: u32) { let expensive_closure |num| { println!(calculating slowly...); thread::sleep(Duration::from_secs(2)); num }; if intensity 25 { println!(Today, do {} pushups!, expensive_closure(intensity)); println!(Next, do {} situps!, expensive_closure(intensity)); } else { if random_number 3 { println!(Take a break today! Remember to stay hydrated!); } else { println!(Today, run for {} minutes!, expensive_closure(intensity)); } } }这里的参数num不需要显式声明类型是因为下文的调用中传进去的参数intensity的类型为u32Rust推断出num的类型为u32。13.2.2. 函数和闭包定义的语法这里有4个例子fn add_one_v1 (x: u32) - u32 { x 1 } let add_one_v2 |x: u32| - u32 { x 1 }; let add_one_v3 |x| { x 1 }; let add_one_v4 |x| x 1 ;第一个是函数的定义有函数名形参名及类型和返回值类型第二个是闭包的定义有参数和返回值的类型。这个闭包看着和函数的定义差不多。第三个同样是闭包但是没有标注参数和返回值的类型就得靠编译器推断了。第四个闭包跟第三个的不同之处在于没有了花括号{}。因为只有一个表达式所以闭包的{}也可以被省略13.2.3. 闭包的类型推断闭包的定义最终只会为参数/返回值推断出唯一具体的类型。看个例子let example_closure |x| x; let s example_closure(String::from(hello)); let n example_closure(5);输出$ cargo run Compiling closure-example v0.1.0 (file:///projects/closure-example) error[E0308]: mismatched types -- src/main.rs:5:29 | 5 | let n example_closure(5); | --------------- ^ expected String, found integer | | | arguments to this function are incorrect | note: expected because the closure was earlier called with an argument of type String -- src/main.rs:4:29 | 4 | let s example_closure(String::from(hello)); | --------------- ^^^^^^^^^^^^^^^^^^^^^ expected because this argument is of type String | | | in this closure call note: closure parameter defined here -- src/main.rs:2:28 | 2 | let example_closure |x| x; | ^ help: try using a conversion method | 5 | let n example_closure(5.to_string()); | For more information about this error, try rustc --explain E0308. error: could not compile closure-example (bin closure-example) due to 1 previous errorRust编译器在闭包第一次被调用时发现它接收的值和输出的值都是String类型就锁定这个闭包的参数和返回值都是String类型。所以后面又使用i32类型时就会报错。
延伸阅读

更多相关文章

2026/11/9 2:37:33

深入解析TI MibSPI关键寄存器:从DMA配置到RAM奇偶校验实战

1. 项目概述:从寄存器位域到系统可靠性的桥梁在嵌入式系统,尤其是汽车电子和工业控制这类对实时性与可靠性要求严苛的领域,与外设的每一次数据交换都容不得半点差错。我们常常与SPI(串行外设接口)打交道,用…

2026/11/8 17:11:29

离线语音识别芯片从选型到量产:手把手带你走完完整流程

信息摘要:很多工程师第一次做语音识别项目时,面对一堆芯片型号不知道该选哪颗。选贵了成本扛不住,选便宜了识别距离不够,选错了封装还得改板子。本文以唯创知音7款离线语音识别芯片为线索,从实际产品场景出发&#xff…

2026/11/8 5:06:02

【Rust自学】13.3. 闭包 Pt.3:使用泛型参数和fn trait来存储闭包

13.3 闭包 Pt.3:使用泛型参数和fn trait来存储闭包 13.3.0. 写在正文之前 Rust语言在设计过程中受到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量…

2026/11/9 7:13:43

特种工证郑州过期了别慌!电子证书复审全流程全解析

特种工证郑州过期了别慌!电子证书复审全流程全解析 证书过期了不知道怎么复审延期?郑州的特种工证持有者,尤其是南阳卧龙区从事水利工程的你,千万别慌。现在电子证书已经全面推行,复审流程也比以前更加清晰。不过,很多工人还是因为不了解政策,错过了复…

2026/11/9 7:13:43

越秀低压电工证难不难报名费多少钱,真实经历告诉你答案

越秀低压电工证难不难报名费多少钱,真实经历告诉你答案 工地太忙根本没时间复习考试,这句话我听太多次了。作为在工地一线干了五年的电工,我深知这个证对咱们来说有多重要,也明白大家最关心的问题就是: 越秀低压电工证难不难…

2026/11/9 7:13:43

办理电工证不需考试行业前景与薪资待遇

电工证不用考试也能拿?多久拿证别再踩坑了 实操考试心里没底怕挂科,你不是一个人,但你知道吗?在河南焦作,很多中小型施工企业负责人其实早就知道, 办理电工证不需考试 ,也能拿到国家认可的证书,而且 多久拿证 ,比你想象中更快。…

2026/11/9 7:08:43

煤气作业证哪里查在哪考 5个真相告诉你怎么避坑

煤气作业证哪里查在哪考 5个真相告诉你怎么避坑 你是不是正盯着手机屏幕发愁,不知道 煤气作业证哪里查 ,也不知道 在哪考 ?怕被中介骗钱,怕跑错地方,怕考不过还白花钱,这些担心我都懂。今天咱们就来掰扯清楚,到底怎么安全、靠谱地考到这个证,别…

2026/11/9 0:37:55

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/9 0:03:09

建设厅的特种工有哪些含金量高?别交完钱考不过

建设厅的特种工有哪些含金量高?别交完钱考不过 怕考不过白交培训费?别急,先搞清楚建设厅的特种工有哪些含金量高的证,再决定是不是值得投入时间和金钱。 建设厅的特种工证是建筑行业里最基础、也最实用的证书之一,涉及多个作业类别,每种证的 含金量…

2026/11/9 0:03:09

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱 怕考不过白交培训费?荆门市电工证报名前必须知道这些避坑指南。别看网上一堆培训机构广告,真要报个电工证,很多人被坑得一塌糊涂。特别是那些打着“包过”旗号的,最后不是考试不过,就是证不是全国通…

2026/11/9 0:03:09

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑 不知道去哪报名怕被中介坑?你不是一个人。现在特种作业证报名渠道五花八门,从线下培训机构到线上代理,真假难辨。尤其是像高空电工作业这类高风险、高门槛的作业类型,证书含金量和考试通过率直接影响你…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑