Rust Turbofish 的由来

0x01 什么是 Turbofish
我们运行如下 Rust Snippet:
fn main() {let numbers: Vec<i32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];let even_numbers = numbers.into_iter().filter(|n| n % 2 == 0).collect();println!("{:?}", even_numbers);
}
不出意外,Rust 编译器一定会抛出错误
aggresss@traitx tmp % branch:[main]% cargo checkChecking tmp v0.1.0 (/tmp)
error[E0283]: type annotations needed--> tmp/src/main.rs:3:9|
3 | let even_numbers = numbers.into_iter().filter(|n| n % 2 == 0).collect();| ^^^^^^^^^^^^ ------- type must be known at this point|= note: cannot satisfy `_: FromIterator<i32>`
note: required by a bound in `collect`--> /Users/aggresss/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs:2050:19|
2050 | fn collect<B: FromIterator<Self::Item>>(self) -> B| ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `Iterator::collect`
help: consider giving `even_numbers` an explicit type|
3 | let even_numbers: Vec<_> = numbers.into_iter().filter(|n| n % 2 == 0).collect();| ++++++++For more information about this error, try `rustc --explain E0283`.
error: could not compile `tmp` (bin "tmp") due to 1 previous error
上面的错误可以通过两种方式解决
-
第一种方式在 even_numbers 变量声明时声明类型:
let even_numbers: Vec<_> = numbers.into_iter().filter(|n| n % 2 == 0).collect(); -
第二种方式使用 Turbofish 语法,在泛型函数后面加入
::<>:let even_numbers = numbers.into_iter().filter(|n| n % 2 == 0).collect::<Vec<_>>();
泛型在编译的过程中要被实例化,大多数情况下,具体类型是基于 Hindley-Milner 理论的类型推断,但是在一些特殊情况下,我们需要显示声明类型来帮助编译器排除歧义,这也是 Turbofish 存在的原因。
在使用泛型的过程中,其他语言也会遇到类似的问题,例如 C++ 中使用 ident<T>,或者 Golang 中使用 ident[T],而 Rust 中确使用 ident::<T>,多了两个冒号(double colon),第一次看到确实觉得有点多余,通过考古在 reddit 上看到 Anna Harren (u/deadstone) 的解释后理解了这样设计的初衷,即可以降低编译器的语法解析难度。

这是一种从语言设计者角度的 Tradeoff,所以语言的使用者多少会有一些疑问或抱怨,在 Rust 社区中确实也会时常听到一些相关的声音,但是当知道了 Turbofish 语法由来的故事后,我已经开始喜欢 ::<> 这个符号。
0x02 Turbofish 的由来
在 2015 年的时候,Anna Harren 第一次提出使用 ::<> 来辅助编译器进行类型判断,同时给它起了一个很有意思的名字 –– TURBOFISH,很快这个名字也被 Rust 官方所采纳,这个符号确实挺像一条加速的鱼,还有人做了一个页面 https://turbo.fish/。不幸的是在 2021 年 Anna Harren 因患癌症离开了这个世界,Rust 1.55.0 的 Release Note 特别提到了她,并将这个版本作为对 Anna Harren 的纪念。

可能开源社区的魅力就在于对多样性的包容,Rust 社区争吵不断,但更容易诞生有趣的事物,毕竟这个世界有那么多有趣的灵魂。
0x03 Furthermore
有一个彩蛋发现,将 Turbofish 符号 ::<> 倒过来, 即 <>::,Rust 在 Disambiguating Function Calls 中使用 :: 作为 namespace qualifier,同时使用 <>:: 作为路径中存在类型混淆时的显示声明,例如:
fn main() {let s = "Hello, World!";let string = <&str as Into<String>>::into(&s);println!("{}", string);
}
这种方法早期被叫做 UFCS (Universal Function Call Syntax),于此同时,使用 Turbofish 也可以反向解决上面的问题:
fn main() {let s = "Hello, World!";let string = Into::<String>::into(s);println!("{}", string);
}
从优雅对称的角度看,我还是支持 Turbofish 仍然是 Turbofish。
0x04 Reference
- https://www.reddit.com/r/rust/comments/3fimgp/comment/ctozkd0/
- https://github.com/rust-lang/rust/blob/master/tests/ui/parser/bastion-of-the-turbofish.rs
- https://foundation.rust-lang.org/news/member-spotlight-turbofish/
- https://turbo.fish/
- https://github.com/jplatte/turbo.fish
- https://blog.rust-lang.org/2021/09/09/Rust-1.55.0.html#dedication
- https://matematikaadit.github.io/posts/rust-turbofish.html
- https://www.reddit.com/r/rust/comments/v4rir6/turbofish_why/
- https://techblog.tonsser.com/posts/what-is-rusts-turbofish
- https://doc.rust-lang.org/reference/expressions/call-expr.html
相关文章:
Rust Turbofish 的由来
0x01 什么是 Turbofish 我们运行如下 Rust Snippet: fn main() {let numbers: Vec<i32> vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];let even_numbers numbers.into_iter().filter(|n| n % 2 0).collect();println!("{:?}", even_numbers); }不出意…...
2.外卖点餐系统(Java项目 springboot)
目录 0.系统的受众说明 1.系统功能设计 2.系统结构设计 3.数据库设计 3.1实体ER图 3.2数据表 4.系统实现 4.1用户功能模块 4.2管理员功能模块 4.3商家功能模块 4.4用户前台功能模块 4.5骑手功能模块 5.相关说明 新鲜运行起来的项目:如需要源码数据库…...
Universal Thresholdizer:将多种密码学原语门限化
参考文献: [LS90] Lapidot D, Shamir A. Publicly verifiable non-interactive zero-knowledge proofs[C]//Advances in Cryptology-CRYPTO’90: Proceedings 10. Springer Berlin Heidelberg, 1991: 353-365.[Shoup00] Shoup V. Practical threshold signatures[C…...
【UE5学习笔记】编辑及运行界面:关闭眼部识别(自动曝光)
自动曝光,也就是走进一个黑暗的环境,画面会逐渐变量,以模拟人眼进入黑暗空间时瞳孔放大,进光量增加的一种真实视觉感受: 制作过程中是否关闭自动曝光,取决于游戏的性质,但是个人认为,…...
未来科技的前沿:深入探讨人工智能的进展、机器学习技术和未来趋势
文章目录 一、人工智能的定义和概述1. 人工智能的基本概念2. 人工智能的发展历史 二、技术深入:机器学习、深度学习和神经网络1. 机器学习2. 深度学习3. 神经网络 三、人工智能的主要目标和功能1. 自动化和效率提升2. 决策支持和风险管理3. 个性化服务和预测未来 本…...
3-qt综合实例-贪吃蛇的游戏程序
引言: 如题,本次实践课程主要讲解贪吃蛇游戏程序。 qt贪吃蛇项目内容: 一、功能需求 二、界面设计 各组件使用: 对象名 类 说明 Widget QWidge 主窗体 btnRank QPushButton 排行榜-按钮 groupBox QGroupBox 难…...
QGraphicsView实现简易地图12『平移与偏移』
前文链接:QGraphicsView实现简易地图11『指定层级-定位坐标』 提供地图平移与偏移功能。地图平移是指将地图的中心点更改为给定的点,即移动地图到指定位置。地图偏移是指将当前视口内的地图向上/下/左/右/进行微调,这里偏移视口宽/高的四分之…...
深入探索 Vue 中的 createVNode 与 resolveComponent
在 Vue 开发中,createVNode和resolveComponent是两个至关重要的工具,它们为我们提供了强大的能力来灵活地创建和操控组件。 一、首先,让我们深入了解一下createVNode。 这是一个用于创建虚拟节点的关键函数,通过它,我…...
【记录42】centos 7.6安装nginx教程详细教程
环境:腾讯云centos7.6 需求:安装nginx-1.24.0 1. 切入home文件 cd home 2. 创建nginx文件 mkdir nginx 3. 切入nginx文件 cd nginx 4. 下载nginx安装包 wget https://nginx.org/download/nginx-1.24.0.tar.gz 5. 解压安装包 tar -zxvf nginx-1.24.0.…...
C语言程序设计(不熟悉的点)
一、switch多路分支语句 二、条件表达式 三、循环 for循环: for循环的三个表达式不是必须的,第一个表达式之前声明过,可以不写,第三个表达式可以放在循环体里面;第二个表达式可以不写,为死循环。 空循环…...
DAO是什么?有什么用途?
DAO(Decentralized Autonomous Organization,去中心化自治组织)是一种基于区块链技术的组织形式,它没有中央管理层,而是通过智能合约和区块链上的代码来运作。DAO 的决策过程是透明的,通常由组织的成员通过…...
Socket学习记录
本次学习Socket的编程开发,该技术在一些通讯软件,比如说微信,QQ等有广泛应用。 网络结构 这些都是计算机网络中的内容,我们在这里简单回顾一下: UDP(User Datagram Protocol):用户数据报协议;TCP(Transmission Contr…...
黑马 - websocket搭建在线聊天室
这里写自定义目录标题 一、消息推送常见方式二、websocket 是什么?三、websocket api的介绍1、客户端 (浏览器)2、服务端api 四、实现在线聊天室1、需求2、聊天室流程分析3、消息格式4、代码实现 一、消息推送常见方式 1、轮训方式 2、SSE…...
【每日力扣】543. 二叉树的直径与101. 对称二叉树
🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害 543. 二叉树的直径 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的…...
【linux】——日志分析
1. 日志文件 1.1 日志文件的分类 日志文件: 是用于记录Linux系统中各种运行消息的文件,相当于Linux主机的“日记". 日志文件对于诊断和解决系统中的问题很有帮助,系统一旦出现问题时及时分析日志就会“有据可查”。此外。当主机遭受攻…...
【intro】GraphSAGE
论文 https://arxiv.org/pdf/1706.02216 abstract 大图中节点的低维embedding已经被证明在各种预测任务中非常有用,然而,大多数现有的方法要求在embedding训练期间图中的所有节点都存在;这些先前的方法属于直推式(transductive)…...
管理能力学习笔记九:授权的常见误区和如何有效授权
授权的常见误区 误区一:随意授权 管理者在授权工作时,需要依据下属的能力、经验、意愿问最自己:这项工作适合授权给Ta做吗?如果没有,可以通过哪些方法进行培训呢? 误区二:缺乏信任 心理暗示…...
第21天 反射
反射概述 想象一下,你在一个房间里边,但你看不见自己,也不知道自己是谁。这时候你面前有一个镜子,你可以通过镜子的反射来观察自己。反射就像这面镜子。它让你能够检查、分析、修改Java中的对象、类、方法等 使用情况࿱…...
多链路聚合设备是什么
多链路聚合设备属于通信指挥装备。 乾元通多链路聚合设备,它能够将多个网络链路聚合成一个逻辑链路,以实现高速、稳定、可靠的数据传输。多链路聚合设备的核心技术包括链路聚合、负载均衡、故障切换等,能够智能管理和优化利用不同网络链路&a…...
基于springboot+vue+Mysql的自习室预订系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
终极指南:3分钟解决Windows安装iPhone网络共享驱动难题
终极指南:3分钟解决Windows安装iPhone网络共享驱动难题 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mi…...
从Anthropic论文到工程落地:Harness engineering结合claude code,讲解四层前端架构规范
AI 时代,许多人都体验过了vibecoding,但结果不同。 😀 同一个需求,不同的人用 AI 写,出来的代码质量可能差很远。 有的人能跑出一个中型功能,PR 干干净净的; 有的人用 AI 写出来的ÿ…...
Shoelace自动加载器:终极懒加载Web组件完整指南 [特殊字符]
Shoelace自动加载器:终极懒加载Web组件完整指南 🚀 【免费下载链接】shoelace Shoelace is now Web Awesome. Come see what’s new! 项目地址: https://gitcode.com/gh_mirrors/sh/shoelace Shoelace自动加载器是Shoelace Web组件库中一个革命性…...
中文知识管理利器:本地化部署与向量检索实践指南
1. 项目概述:一个面向中文用户的知识管理利器 最近在折腾个人知识库,发现了一个挺有意思的开源项目,叫 RomeoSY/zh-knowledge-manager 。乍一看名字,你可能觉得这又是一个“知识管理”工具,市面上不是有 Notion、Ob…...
基于PanoSim5.0虚拟仿真平台的自主代客泊车AVP系统开发教程
1. PanoSim5.0与AVP系统开发入门指南 第一次接触PanoSim5.0时,我和大多数开发者一样被它丰富的功能模块震撼到了。这个国产仿真平台不仅支持高精度的车辆动力学建模,还能实现逼真的传感器仿真和环境渲染。对于自主代客泊车(AVP)这种需要反复测试的场景来…...
深度强化学习在航天控制中的仿真到实物迁移挑战
1. 深度强化学习在航天控制领域的应用背景卫星近距离操作是航天任务中的一项关键技术挑战,涉及轨道交会、在轨服务、空间目标检测等多种场景。传统基于模型预测控制(MPC)的方法需要精确的环境动力学模型,而实际太空环境中存在诸多…...
芯片设计人才培养:从Sondrel模式看产学合作如何弥合能力鸿沟
1. 项目背景与行业契机最近在整理行业资料时,翻到一篇十多年前的旧闻,讲的是英国一家名为Sondrel的系统级芯片设计咨询公司,与宁波诺丁汉大学合作,启动了一个针对中国学生的芯片设计人才培养项目。这件事发生在2013年,…...
使用Taotoken管理控制台进行APIKey的权限划分与审计日志查看
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken管理控制台进行APIKey的权限划分与审计日志查看 在团队协作开发或构建多应用服务时,统一管理大模型API的访…...
AI编程助手上下文管理工具devcontext:构建项目记忆库提升开发效率
1. 项目概述:当AI助手拥有“记忆”,开发效率的质变如果你和我一样,每天大部分时间都在和代码编辑器、终端以及各种文档打交道,那你一定对这样的场景不陌生:接手一个新项目,光是理解代码库的结构、各个模块的…...
本地化AI代码助手部署指南:从模型选型到性能调优
1. 项目概述:一个面向开发者的本地化AI代码助手最近在GitHub上看到一个挺有意思的项目,叫“JPeetz/Hermes-Studio”。乍一看名字,可能会联想到希腊神话里的信使赫尔墨斯,或者某个设计软件。但点进去你会发现,这其实是一…...
