rust语言闭包trait类型编译器推导总结

Rust编译器根据闭包对捕获的外部变量的使用方式自动推断其实现的Trait类型,如:Fn, FnMut,FnOnce;而非是否捕获所有权。

注意move关键字只是令闭包捕获外部变量的所有权,并非决定闭包的Trait类型为FnOnce。

对捕获变量的使用方式组合:

(1)捕获外部变量的所有权。

(2)消耗捕获的变量,消耗:释放,杀死,清除,关闭等。

(3)只读。

(4)可写(变)

(5)不可变借用。

(6)可变借用。

(7)捕获的外部变量具有Copy语义。

(1) && (2) => FnOnce.

(1) && (3) => Fn.

(1) && (4) => FnMute.

(5) =>Fn.

(6) => FnMute.

(7) && (3) => Fn.

(7) && (4) => FnMute.

其他注意事项:

  1. 函数指针fn默认实现了闭包tait: Fn/FnMute/FnOnce. 换言之函数指针可以赋给闭包类型变量。

  2. 对于不捕获任何外部变量的闭包,rust编译器将其优化为一个函数指针,所以这样的闭包类型可以赋值给一个函数指针。

  3. 使用Fn trait闭包类型作为泛型约束可以同时接受函数指针类型和闭包类型。

  4. FnOnce类型闭包被设计的目的:只能被调用一次!用于处理(消耗)那些一次性资源和独占性资源,因为这类资源不能 重复消耗,比如只能被释放清理或关闭一次。

  5. 函数和闭包的根本区别在于前者不能捕获外部变量,即使是嵌套函数也不可以,但是闭包可以。

  6. 每个闭包的具体类型都是不同的,因为rust编译器为每个闭包实现了各自的"匿名结构体",用于存储捕获的外部变量, 同时rust编译器为每个闭包自动推断实现相应的Trait类型,如:Fn/FnMute/FnOnce.

注意:个人水平有限,难免谬误,欢迎指正,仅做参考,抛砖引玉;怕日后遗忘,故随笔记录。

相关推荐
非洲农业不发达21 分钟前
windows终端体验大升级,让你拥有macos级别的美化
前端·后端
妙码生花29 分钟前
从 PHP 到 AI + Golang,程序员自救转型手记(十七):登录接口完善,登录页接口整合,解决跨域
前端·后端·ai编程
SamDeepThinking1 小时前
从源码到代码:MyBatis-Flex 与 MyBatis-Plus 的逐项对比
java·后端·程序员
shepherd1111 小时前
一文带你掌握 LLM、Token、Context、Prompt、RAG、MCP、Skill、Agent 等 AI 核心概念
人工智能·后端·ai编程
狂炫冰美式2 小时前
人均配了AI, 为什么公司还是没变快? 🤔 本质还是分布式系统问题
前端·后端·架构
花褪残红青杏小3 小时前
Rust图像处理第11节-故障风 RGB 通道偏移:错位错色制造电子故障
rust·webassembly·图形学
她的男孩4 小时前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
爱读源码的大都督4 小时前
Claude Code源码分析(三):为什么系统提示词中需要有tools呢?
前端·人工智能·后端
爱勇宝4 小时前
Claude Code 被曝暗藏“隐形检测”代码:封代理不是最可怕的,可怕的是你根本不知道它在干什么
前端·后端·程序员