当前位置: 首页 > news >正文

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() 可以处理任何可迭代的对象&#xff0c;并将其转换为相关的集合 collect() 最基本模式是将一个集合转换为另一个集合&#xff1a; 先获取一个集合&#xff0c;对其调用 iter 方法&#x…...

C# 类型转换

C# 类型转换 引言 在C#编程语言中&#xff0c;类型转换是一种将一个数据类型的变量转换成另一个数据类型的操作。类型转换是编程中常见的操作&#xff0c;特别是在处理不同数据类型的变量时。本文将详细探讨C#中的类型转换&#xff0c;包括隐式转换和显式转换&#xff0c;以及…...

[IP] DDR_FIFO(DDR3 用户FIFO接口)

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

第三百七十二节 JavaFX教程 - JavaFX HTMLEditor

JavaFX教程 - JavaFX HTMLEditor HTMLEditor控件是一个富文本编辑器&#xff0c;具有以下功能。 粗体斜体下划线删除线字体系列字体大小前景色背景颜色缩进项目符号列表编号列表对齐水平线复制文本片段粘贴文本片段 HTMLEditor类返回HTML字符串中的编辑内容。 创建HTML编辑器…...

蓝桥杯试题:DFS回溯

一、题目要求 输入一个数组n&#xff0c;输出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)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…...

每日一题——接雨水

接雨水问题详解 问题描述 给定一个非负整数数组 height&#xff0c;表示每个宽度为 1 的柱子的高度图。计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#…...

java常见面试01

为什么重写 equals 还要重写 hashcode &#x1f308; 核心原因&#xff1a; 当两个对象通过equals()判断为相等时&#xff0c;它们的hashCode()必须返回相同的整数值&#xff01;这是Java世界的交通规则哦~&#xff08;交警曼波敬礼.jpg&#xff09; &#x1f9e9; 具体场景…...

算法-二叉树篇27-把二叉搜索树转换为累加树

把二叉搜索树转换为累加树 力扣题目链接 题目描述 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提…...

C语言:51单片机 基础知识

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

olmOCR:使用VLM解析PDF

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

数据结构(初阶)(七)----树和二叉树(堆,堆排序)

八&#xff0c;树与二叉树 树 概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽叶朝下的。 • 有⼀…...

图像分类项目1:基于卷积神经网络的动物图像分类

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

Kali Linux 2024.4版本全局代理(wide Proxy)配置,适用于浏览器、命令行

1. 网络拓扑介绍&#xff08;不使用虚拟机直接跳到2&#xff09; 虚拟机&#xff1a;VMware 17 Pro&#xff0c;为本机开启桥接模式。 我的究极套娃网络&#xff1a;手机V2rayNG代理端口为10808&#xff0c;开热点 -> 电脑连接wifi -> 虚拟机中运行kali 2. kali 配置…...

[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2

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

不要升级,Flutter Debug 在 iOS 18.4 beta 无法运行,提示 mprotect failed: Permission denied

近期如果有开发者的 iOS 真机升级到 18.4 beta&#xff0c;大概率会发现在 debug 运行时会有 Permission denied 的相关错误提示&#xff0c;其实从 log 可以很直观看出来&#xff0c;就是 Dart VM 在初始化时&#xff0c;对内核文件「解释运行&#xff08;JIT&#xff09;」时…...

介绍 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

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

InterHand26M(handposeX-json 格式)数据集-release >> DataBall

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” 贵在坚持&#xff01; ---------------------------------------…...

[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)

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

低成本GPU算力方案:MT5中文文本增强镜像在RTX3060上高效部署实录

低成本GPU算力方案&#xff1a;MT5中文文本增强镜像在RTX3060上高效部署实录 你是不是也遇到过这样的烦恼&#xff1f;手头有一些中文文本数据&#xff0c;想用来训练模型&#xff0c;但数量太少&#xff0c;模型总是学不好。或者&#xff0c;你写了一段文案&#xff0c;想看看…...

C++11避坑指南:auto类型推导的7个常见错误及如何避免

C11避坑指南&#xff1a;auto类型推导的7个常见错误及如何避免 在C11标准中&#xff0c;auto关键字的引入极大地简化了代码编写过程&#xff0c;让开发者从繁琐的类型声明中解放出来。然而&#xff0c;这种便利性也带来了新的陷阱——类型推导的隐式规则可能导致意料之外的行为…...

解锁Linux平台微信小程序开发:终极完整环境搭建指南

解锁Linux平台微信小程序开发&#xff1a;终极完整环境搭建指南 【免费下载链接】wechat-web-devtools-linux 适用于微信小程序的微信开发者工具 Linux移植版 项目地址: https://gitcode.com/gh_mirrors/we/wechat-web-devtools-linux 你是否曾为在Linux系统上无法使用微…...

Ubuntu 24.04 Noble Numbat 尝鲜记:用Docker搞定ROS 2 Humble开发环境(附镜像拉取与容器运行全流程)

Ubuntu 24.04 Noble Numbat 尝鲜记&#xff1a;用Docker搞定ROS 2 Humble开发环境&#xff08;附镜像拉取与容器运行全流程&#xff09; 当Ubuntu 24.04 Noble Numbat遇上ROS 2 Humble&#xff0c;就像两个来自不同时空的旅行者相遇——一个是最新发布的系统版本&#xff0c;另…...

保姆级教程:在Ubuntu 20.04上搞定Isaac Gym Preview 4和强化学习环境(含常见libpython报错解决)

保姆级教程&#xff1a;在Ubuntu 20.04上搞定Isaac Gym Preview 4和强化学习环境&#xff08;含常见libpython报错解决&#xff09; 刚接触Isaac Gym的机器人/强化学习新手&#xff0c;往往会在环境配置阶段遇到各种依赖问题。本文将提供一个从零开始的详细安装指南&#xff0c…...

COMSOL多场耦合地应力平衡开挖与衬砌支护案例:带衬砌与钢衬支护的实践研究

COMSOL 地应力平衡后开挖及衬砌支护案例&#xff08;带衬砌、钢衬&#xff09;隧道开挖模拟最头疼的就是初始地应力场的平衡问题。前些天用COMSOL折腾了个带衬砌支护的案例&#xff0c;今天把关键步骤拆开说说。咱们直接从地应力平衡开始&#xff0c;到开挖后钢衬安装一气呵成。…...

Phi-3-mini-4k-instruct-gguf完整指南:GGUF轻量模型在边缘设备的适配实践

Phi-3-mini-4k-instruct-gguf完整指南&#xff1a;GGUF轻量模型在边缘设备的适配实践 1. 模型概述 Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本&#xff0c;专为边缘计算设备优化设计。这个模型特别适合在资源受限的环境中执行问答、文本改写…...

【MobaXterm进阶】SSH连接稳定性优化:Keepalive与超时设置详解

1. 为什么SSH连接会频繁断开&#xff1f; 很多朋友在用MobaXterm远程连接服务器时都遇到过这样的困扰&#xff1a;明明连接得好好的&#xff0c;过一会儿就莫名其妙断开了。特别是当你正在执行一个耗时较长的任务时&#xff0c;突然中断简直让人抓狂。这种情况在家庭版用户中尤…...

ClearerVoice-Studio语音分离实用技巧:分离后各声道说话人身份标注方法

ClearerVoice-Studio语音分离实用技巧&#xff1a;分离后各声道说话人身份标注方法 你是不是也遇到过这种情况&#xff1f;用语音分离工具把一段多人对话音频分成了几个独立的声道&#xff0c;结果看着一堆命名为“output_1.wav”、“output_2.wav”的文件&#xff0c;完全搞不…...

PyTorch 2.8视频生成环境搭建:FFmpeg 6.0+Diffusers开箱即用教程

PyTorch 2.8视频生成环境搭建&#xff1a;FFmpeg 6.0Diffusers开箱即用教程 1. 环境准备与快速验证 在开始视频生成项目前&#xff0c;我们需要确保基础环境已经正确配置。本教程使用的镜像已经预装了所有必要的组件&#xff0c;包括&#xff1a; 核心框架&#xff1a;PyTor…...