Rust ~ Collect
背景
Transforms an iterator into a collection
将一个迭代器转换为一个集合
collect()
可以处理任何可迭代的对象,并将其转换为相关的集合
collect()
最基本模式是将一个集合转换为另一个集合:
先获取一个集合,对其调用 iter
方法,进行转换操作,最后调用 collect()
collect()
还可以创建非典型集合类型的实例。
可以从 char
构建一个 String
可以将由 Result<T, E>
元素组成的迭代器收集到 Result<Collection<T>, E>
中
collect()
的通用性很强,可能会导致类型推断出现问题,因此(As such),collect()
是少数几种会看到被称为“涡轮鱼”语法 ::<>
的情况之一
这有助于类型推断算法明确你要收集到的具体集合类型。
Because collect()
is so general, it can cause problems with type inference. As such, collect()
is one of the few times you’ll see(少数几种会看到的情况之一) the syntax affectionately known as the ‘turbofish’: ::<>
. This helps the inference algorithm understand specifically which collection you’re trying to collect into.
定义
fn collect<B: FromIterator<Self::Item>>(self) -> B
whereSelf: Sized,
{FromIterator::from_iter(self)
}
示例
从 char
构建 String
fn main() {// 定义一个包含多个 char 元素的数组let chars = ['H', 'e', 'l', 'l', 'o'];// 使用 collect() 方法将字符数组转换为 Stringlet hello_string: String = chars.iter().cloned().collect();// 输出结果println!("构建的字符串是: {}", hello_string);
}
将 Result<T, E>
元素组成的迭代器收集到 Result<Collection<T>, E>
中
use std::result::Result;fn main() {// 定义一个包含多个 Result 元素的数组let results: [Result<i32, &str>; 3] = [Ok(1), Ok(2), Ok(3)];// 使用 collect() 方法将 Result 数组收集到一个新的 Result 中let collection_result: Result<Vec<i32>, &str> = results.iter().cloned().collect();match collection_result {Ok(values) => {println!("收集到的元素是: {:?}", values);}Err(error) => {println!("收集过程中出现错误: {}", error);}}// 包含错误元素的情况let error_results: [Result<i32, &str>; 3] = [Ok(1), Err("出错啦"), Ok(3)];let error_collection_result: Result<Vec<i32>, &str> = error_results.iter().cloned().collect();match error_collection_result {Ok(values) => {println!("收集到的元素是: {:?}", values);}Err(error) => {println!("收集过程中出现错误: {}", error);}}
}
源码中的示例
fn main() {let a = [1, 2, 3];let doubled: Vec<i32> = a.iter().map(|&x| x * 2).collect();assert_eq!(vec![2, 4, 6], doubled);use std::collections::VecDeque;let a = [1, 2, 3];let doubled: VecDeque<i32> = a.iter().map(|&x| x * 2).collect();assert_eq!(2, doubled[0]);assert_eq!(4, doubled[1]);assert_eq!(6, doubled[2]);let a = [1, 2, 3];let doubled = a.iter().map(|x| x * 2).collect::<Vec<i32>>();assert_eq!(vec![2, 4, 6], doubled);let a = [1, 2, 3];let doubled = a.iter().map(|x| x * 2).collect::<Vec<_>>();assert_eq!(vec![2, 4, 6], doubled);let chars = ['g', 'd', 'k', 'k', 'n'];let hello: String = chars.iter().map(|&x| x as u8).map(|x| (x + 1) as char).collect();assert_eq!("hello", hello);use std::result::Result;let results = [Ok(1), Err("nope"), Ok(3), Err("bad")];let result: Result<Vec<_>, &str> = results.iter().cloned().collect();// gives us the first errorassert_eq!(Err("nope"), result);let results = [Ok(1), Ok(3)];let result: Result<Vec<_>, &str> = results.iter().cloned().collect();// gives us the list of answersassert_eq!(Ok(vec![1, 3]), result);
}
什么是 turbofish~涡轮鱼语法 ::<>
turbofish涡轮鱼语法 ::<>
是一种用于帮助编译器进行类型推断的语法糖,主要在泛型类型的上下文中使用,特别是在调用泛型函数或方法时,当编译器无法自动推断出具体的泛型参数类型时,就可以使用 “涡轮鱼” 语法来显式地指定泛型参数。
为什么需要 “涡轮鱼” 语法
Rust 编译器有强大的类型推断能力,很多时候可以自动推断出泛型参数的具体类型,但在某些复杂的场景下,编译器可能无法准确推断。例如,当调用一个泛型方法,该方法可以返回多种不同类型的结果时,编译器就需要额外的信息来确定具体的类型。这时,“涡轮鱼” 语法就派上用场了,它允许开发者显式地指定泛型参数,从而帮助编译器消除类型歧义。
“涡轮鱼” 语法的使用场景
collect 方法
collect 是 Rust 标准库中一个非常常用的方法,用于将一个迭代器转换为一个集合。由于 collect 方法可以返回多种不同类型的集合,编译器有时无法自动推断出具体的集合类型,这时就需要使用 “涡轮鱼” 语法来指定。
fn main() {let numbers = vec![1, 2, 3, 4, 5];// 使用“涡轮鱼”语法显式指定泛型参数为 Vec<i32>let squared: Vec<i32> = numbers.iter().map(|x| x * x).collect::<Vec<i32>>();println!("{:?}", squared);
}
collect 方法可以将迭代器的元素收集到多种不同类型的集合中,如 Vec、HashSet 等。
通过使用 “涡轮鱼” 语法 ::<Vec<i32>>
,明确告诉编译器要将元素收集到一个 Vec 类型的集合中
泛型函数调用
当调用泛型函数时,如果编译器无法推断出泛型参数的具体类型,也可以使用 “涡轮鱼” 语法来指定。
fn identity<T>(x: T) -> T {x
}fn main() {// 使用“涡轮鱼”语法显式指定泛型参数为 i32let result = identity::<i32>(42);println!("{}", result);
}
identity 是一个泛型函数,它接受一个类型为 T 的参数并返回该参数。通过使用 “涡轮鱼” 语法 ::<i32>
,明确告诉编译器 T 的具体类型是 i32。
部分类型提示与 “涡轮鱼” 语法
在某些情况下,可能只需要部分指定泛型参数的类型,这时可以使用 _ 作为占位符。
fn main() {let numbers = vec![1, 2, 3, 4, 5];// 使用部分类型提示,让编译器推断元素类型let squared = numbers.iter().map(|x| x * x).collect::<Vec<_>>();println!("{:?}", squared);
}
collect::<Vec<_>>
表示要将元素收集到一个 Vec 类型的集合中,但具体的元素类型由编译器根据上下文自动推断。
综上所述,
总结
“涡轮鱼” 语法 ::<>
是 Rust 中一种用于显式指定泛型参数的有用工具,它可以帮助编译器消除类型歧义,使代码更加清晰和易于理解。
相关文章:
Rust ~ Collect
背景 Transforms an iterator into a collection 将一个迭代器转换为一个集合 collect() 可以处理任何可迭代的对象,并将其转换为相关的集合 collect() 最基本模式是将一个集合转换为另一个集合: 先获取一个集合,对其调用 iter 方法&#x…...
C# 类型转换
C# 类型转换 引言 在C#编程语言中,类型转换是一种将一个数据类型的变量转换成另一个数据类型的操作。类型转换是编程中常见的操作,特别是在处理不同数据类型的变量时。本文将详细探讨C#中的类型转换,包括隐式转换和显式转换,以及…...

[IP] DDR_FIFO(DDR3 用户FIFO接口)
IP(DDR_FIFO)将DDR3 IP的用户侧复杂接口修改为简易的FIFO接口,用户侧更加简易例化使用MIG 核 IP介绍 c0_xx (连接DDR app接口) 此IP 仅需根据MIG配置进行有限修改,即可使用! 关于IP详细使用说明,参考IP datasheet! 示…...

第三百七十二节 JavaFX教程 - JavaFX HTMLEditor
JavaFX教程 - JavaFX HTMLEditor HTMLEditor控件是一个富文本编辑器,具有以下功能。 粗体斜体下划线删除线字体系列字体大小前景色背景颜色缩进项目符号列表编号列表对齐水平线复制文本片段粘贴文本片段 HTMLEditor类返回HTML字符串中的编辑内容。 创建HTML编辑器…...
蓝桥杯试题:DFS回溯
一、题目要求 输入一个数组n,输出1到n的全排列 二、代码展示 import java.util.*;public class ikun {static List<List<Integer>> list new ArrayList<>();public static void main(String[] args) { Scanner sc new Scanner(System.in);…...

Lua | 每日一练 (4)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…...
每日一题——接雨水
接雨水问题详解 问题描述 给定一个非负整数数组 height,表示每个宽度为 1 的柱子的高度图。计算按此排列的柱子,下雨之后能接多少雨水。 示例 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释&#…...

java常见面试01
为什么重写 equals 还要重写 hashcode 🌈 核心原因: 当两个对象通过equals()判断为相等时,它们的hashCode()必须返回相同的整数值!这是Java世界的交通规则哦~(交警曼波敬礼.jpg) 🧩 具体场景…...
算法-二叉树篇27-把二叉搜索树转换为累加树
把二叉搜索树转换为累加树 力扣题目链接 题目描述 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提…...

C语言:51单片机 基础知识
一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等,具有一定规模的微型计算机。 特点: 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…...

olmOCR:使用VLM解析PDF
在PDF解析中,目前主流的开源工具包括Minuer、GOT OCR等。主要都是通过飞桨等OCR套件组装的一套pipeline,或者直接通过VLM解析图像。 #一、 olmOCR是使用VLM进行的端到端的PDF文档解析 二、document-anchoring 与上述的不同在于,olmOCR使用…...

数据结构(初阶)(七)----树和二叉树(堆,堆排序)
八,树与二叉树 树 概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。 • 有⼀…...

图像分类项目1:基于卷积神经网络的动物图像分类
一、选题背景及动机 在现代社会中,图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用,例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类,可以帮助人们更好地了解动物种类、数量和分布情况,…...

Kali Linux 2024.4版本全局代理(wide Proxy)配置,适用于浏览器、命令行
1. 网络拓扑介绍(不使用虚拟机直接跳到2) 虚拟机:VMware 17 Pro,为本机开启桥接模式。 我的究极套娃网络:手机V2rayNG代理端口为10808,开热点 -> 电脑连接wifi -> 虚拟机中运行kali 2. kali 配置…...

[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2
Video Subtitle Master 1.5.2 介绍 Video Subtitle Master 1.5.2 是一款功能强大的客户端工具,能够批量为视频或音频生成字幕,还支持批量将字幕翻译成其他语言。该工具具有跨平台性,无论是 mac 系统还是 windows 系统都能使用。 参考原文&a…...

不要升级,Flutter Debug 在 iOS 18.4 beta 无法运行,提示 mprotect failed: Permission denied
近期如果有开发者的 iOS 真机升级到 18.4 beta,大概率会发现在 debug 运行时会有 Permission denied 的相关错误提示,其实从 log 可以很直观看出来,就是 Dart VM 在初始化时,对内核文件「解释运行(JIT)」时…...

介绍 torch-mlir 从 pytorch 生态到 mlir 生态
一、引言 The Torch-MLIR project provides core infrastructure for bridging the PyTorch ecosystem and the MLIR ecosystem. For example, Torch-MLIR enables PyTorch models to be lowered to a few different MLIR dialects. Torch-MLIR does not attempt to provide a…...

upload
(上传一句话木马,用蚁剑链接验证是否成功/传有回显的:<?php phpinfo();?>) 学看代码 #function checkfile(){}:定义了一个名叫checkfile的函数 #var file方法.(获取名为‘upload_file’的元素)[获取哪些&…...

InterHand26M(handposeX-json 格式)数据集-release >> DataBall
DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” 贵在坚持! ---------------------------------------…...

[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)
文章目录 1. JVM内存模型2. 常量池中有什么类型?3. 常量池中真正存储的内容是什么4. 判断一个字符串(引用)是否在常量池中5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗?6. 获取堆内存使用情况、非堆内存使用情况 1. JVM内…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...

轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...

WinUI3开发_使用mica效果
简介 Mica(云母)是Windows10/11上的一种现代化效果,是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果,Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...
【Pandas】pandas DataFrame dropna
Pandas2.2 DataFrame Missing data handling 方法描述DataFrame.fillna([value, method, axis, …])用于填充 DataFrame 中的缺失值(NaN)DataFrame.backfill(*[, axis, inplace, …])用于**使用后向填充(即“下一个有效观测值”)…...