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内…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...
