Rust Turbofish 的由来

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) 的解释后理解了这样设计的初衷,即可以降低编译器的语法解析难度。
reddit
这是一种从语言设计者角度的 Tradeoff,所以语言的使用者多少会有一些疑问或抱怨,在 Rust 社区中确实也会时常听到一些相关的声音,但是当知道了 Turbofish 语法由来的故事后,我已经开始喜欢 ::<> 这个符号。

0x02 Turbofish 的由来

在 2015 年的时候,Anna Harren 第一次提出使用 ::<> 来辅助编译器进行类型判断,同时给它起了一个很有意思的名字 –– TURBOFISH,很快这个名字也被 Rust 官方所采纳,这个符号确实挺像一条加速的鱼,还有人做了一个页面 https://turbo.fish/。不幸的是在 2021 年 Anna Harren 因患癌症离开了这个世界,Rust 1.55.0 的 Release Note 特别提到了她,并将这个版本作为对 Anna Harren 的纪念。

twitter_turbofish
可能开源社区的魅力就在于对多样性的包容,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/6093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac 安装anaconda

1. anaconda Anaconda是一个开源的Python和R编程语言的发行版本&#xff0c;用于数据科学、机器学习、大数据处理和科学计算等领域。它包含了一系列用于数据分析和科学计算的软件包、库和工具&#xff0c;以及一个用于管理环境和依赖关系的包管理系统。 Anaconda主要包括以下…

2024年北京高校数学建模校际联赛竞赛B题

B题 铁道线路动态检测数据分析 铁道线路设备是铁路运输业的基础设备&#xff0c;它常年裸露在大自然中&#xff0c;经受着风雨冻融和列车荷载的作用&#xff0c;轨道几何尺寸不断变化&#xff0c;路基及道床不断产生变形&#xff0c;钢轨、联结零件及轨枕不断磨损&#xff0c…

富格林:有效控制暗箱阻挠被骗

富格林悉知&#xff0c;当前现货黄金的行情波动较为激烈&#xff0c;对于我们投资者来说意味着投资盈利的机会多了&#xff0c;但同时投资暗箱风险亦随之而来。如果我们面对暗箱风险没有做好半点准备的话&#xff0c;可能会遭遇巨大损失甚至无法阻挠被骗。那么我们该如何阻挠被…

Android 设置头像 - 相册拍照

Android开发在个人信息管理中&#xff0c;如果设置头像&#xff0c;一般都提供了从相册选择和拍照两种方式。下午将针对设置用户头像相册和拍照两种方式的具体实现进行详细说明。 在实际实现过程中需要使用到权限管理&#xff0c;新版本的Android需要动态申请权限&#xff0c;权…

OceanBase在实际应用中有哪些优势和不足?

OceanBase在实际应用中的优势和不足具体体现在以下几个方面&#xff1a; 优势&#xff1a; 架构创新&#xff1a;OceanBase发布的业内首个单机分布式一体化架构&#xff0c;能够实现单机部署并保持分布式架构的扩展性与集中式架构的性能优势。成本效益&#xff1a;OceanBase能…

mac上 完全清除新安装的python3环境

前言 之前未知的方式安装python3环境 导致python 混乱 先将其清除 操作 X 替换为自己的python版本 卸载 Python3 首先,需要卸载 Python3 及其相关文件。在终端中运行以下命令: sudo rm -rf /Library/Frameworks/Python.framework sudo rm -rf "/Applications/Python 3.…

React Context

Context https://juejin.cn/post/7244838033454727227?searchId202404012120436CD549D66BBD6C542177 context 提供了一个无需为每层组件手动添加 props, 就能在组件树间进行数据传递的方法 React 中数据通过 props 属性自上而下(由父及子)进行传递&#xff0c;但此种用法对…

Matlab|二阶锥松弛在配电网最优潮流计算中的应用

目录 一、主要内容 二、部分代码 三、程序代码 四、下载链接 一、主要内容 最优潮流计算是电网规划、优化运行的重要基础。首先建立了配电网全天有功损耗最小化的最优潮流计算模型&#xff1b;其次结合辐射型配电网潮流特点建立支路潮流约束&#xff0c;并考虑配电网中的可…

产品经理的产品思维

正确的思维 1&#xff1a;解决谁的&#xff0c;2&#xff1a;什么问题&#xff0c;3&#xff1a;用什么方法 错误的思维 技术转型的产品经理&#xff0c;接到一个需求&#xff0c;下意思里会想&#xff1a;用什么方法解决。 思维解读 解决谁的 即有哪些干系人&#xff0c…

macOS sonoma 14.4.1编译JDK 12

macOS sonoma 14.4.1编译JDK 12 环境参考文档开始简述问题心路历程着手解决最终解决(前面有点啰嗦了&#xff0c;可以直接看这里) 记录一次靠自己看代码解决问题的经历(总之就是非常开心)。 首先&#xff0c;先diss一下bing&#xff0c;我差一点就放弃了。 环境 macOS sonom…

git 子模块

git config -f .gitmodules submodule xxx xxx.git git submodule sync 删除&#xff1a; git submodule deinit <name_of_submodule> git rm -f <name_of_submodule> rm -rf .git/modules/<name_of_submodule> git commit -m “Deleted submodule xy” 重…

Java面试题:解释synchronized和java.util.concurrent包中的Lock有什么区别?

在Java中&#xff0c;synchronized和java.util.concurrent包中的Lock都是用于实现线程同步的机制&#xff0c;但它们之间存在一些关键的区别&#xff1a; 使用方式&#xff1a; synchronized是Java的一个关键字&#xff0c;可以用于修饰方法或者代码块&#xff0c;是一种内置的…

商场数据库项目MySQL实战(1——44)

我们在学习了MySQL基础语句后&#xff0c;终于迎来了第一次实战项目。 此次项目包含了88张商场可能用到的数据库表单&#xff0c;以便于商场的日常运行&#xff0c;并记录商场的各项数据。 通过表单的设计和建立&#xff0c;商城项目可以有效地管理用户信息、商品信息、订单和…

[力扣]——125.验证回文串

class Solution {public static boolean isValidChar(char ch){if((ch > a && ch < z) ||(ch > 0 && ch < 9)){return true;}return false;}public boolean isPalindrome(String s) {// 将大小写统一起来s s.toLowerCase();int left 0, right s…

vulnhub靶场之FunBox-2

一.环境搭建 1.靶场描述 Boot2Root ! This can be a real life scenario if rockies becomes admins. Easy going in round about 15 mins. Bit more, if you are find and stuck in the rabbit-hole first. This VM is created/tested with Virtualbox. Maybe it works with…

Stable Diffusion部署到Windows的详细教程

Stable Diffusion是一种文本到图像的潜在扩散模型,它可以从文本描述中生成高质量的图像。在Windows系统上部署Stable Diffusion,可以方便地利用这一功能进行创作或研究。本教程将指导你完成Stable Diffusion在Windows上的部署过程。 一、环境准备 安装Python:首先,确保你的…

百面算法工程师 | 支持向量机——SVM

文章目录 15.1 SVM15.2 SVM原理15.3 SVM解决问题的类型15.4 核函数的作用以及特点15.5 核函数的表达式15.6 SVM为什么引入对偶问题15.7 SVM使用SGD及步骤15.8 为什么SVM对缺失数据敏感15.9 SVM怎么防止过拟合 欢迎大家订阅我的专栏一起学习共同进步 祝大家早日拿到offer&#x…

利用亚马逊云科技GenAI企业助手Amazon Q Business构建企业代码开发知识库

2024年五一节假日的前一天&#xff0c;亚马逊云科技正式重磅发布了云计算行业期待已久的服务——Amazon Q Business。Amazon Q Business是专为企业用户打造的一个开箱即用的完善而强大企业GenAI助手。企业用户只需要将Amazon Q Business连接到现有的企业内部数据源&#xff0c;…

《人大金仓数据库》未来发展的展望

《人大金仓数据库》作为中国社会科学院经济研究所主办的重要数据平台&#xff0c;具有广泛的学术影响力和社会价值。未来&#xff0c;随着信息技术的不断发展和应用场景的不断拓展&#xff0c;人大金仓数据库将迎来更加广阔的发展空间和机遇。本文将对《人大金仓数据库》未来发…

linux安装opencv

先从官网下载源码 https://opencv.org/releases/ 然后解压缩 cd opencv-x.x.x在此路径下新建一个编译目录build mkdir build cd build然后进行编译 cmake ..然后 make -j4报错 [ 42%] Linking CXX shared library ../../lib/libopencv_dnn.so [ 42%] Built target opencv_…