Rust 编程小技巧摘选(6)
目录
Rust 编程小技巧(6)
1. 打印字符串
2. 重复打印字串
3. 自定义函数
4. 遍历动态数组
5. 遍历二维数组
6. 同时遍历索引和值
7. 迭代器方法的区别
8. for_each() 用法
9. 分离奇数和偶数
10. 判断素数(质数)
Rust 编程小技巧(6)
1. 打印字符串
fn main() {println!("Hello, world");let s = "Rust";print!("{}", s);println!();
}
Rust 打印主要用宏 print!()、println!(),打印宏的占位符使用 {}。
2. 重复打印字串
有多种方法,比如使用:循环、string.repeat()、vector.join()等等。
fn main() {for _ in 0..8 {print!("rust");}println!("\n{}", "rust".repeat(8));let s = vec!["rust"; 8];println!("{:?}", s);println!("{}", s.join(""));println!("{}", s.join("."));
}
输出:
rustrustrustrustrustrustrustrust
rustrustrustrustrustrustrustrust
["rust", "rust", "rust", "rust", "rust", "rust", "rust", "rust"]
rustrustrustrustrustrustrustrust
rust.rust.rust.rust.rust.rust.rust.rust
3. 自定义函数
比如,一个整数的平方、绝对值
fn square(x: i32) -> i32 {x * x
}fn abs(x: i32) -> i32 {if x < 0 {return -x;}x
}fn main() {let n = square(9);println!("{}", n);println!("{}", abs(-10));
}
rust 函数的返回关键字 return,在最后的出口可以省略,只需一个表达式(不用分号结尾)。
4. 遍历动态数组
.into_iter() 转迭代器
fn main() {let items = vec![11, 22, 33];for x in items.clone().into_iter() {do_something(x);}items.clone().into_iter().for_each(|x| do_something(x));println!("{:?}", items);
}fn do_something(n: i64) {println!("Number {}", n)
}
输出:
Number 11
Number 22
Number 33
Number 11
Number 22
Number 33
[11, 22, 33]
5. 遍历二维数组
.iter() 创建迭代器
fn main() {let vec = vec![vec![1, 2], vec![3, 4], vec![5, 6]]; for outer_iter in vec.iter() { for inner_iter in outer_iter.iter() { print!("{} ", inner_iter); } }println!();vec.iter().for_each(|x| x.iter().for_each(|y| print!("{} ", y)));println!();
}
6. 同时遍历索引和值
.enumerate() 枚举
fn main() {test1();test2();
}fn test1() {let items = ["a", "b", "c"];for (i, x) in items.iter().enumerate() {println!("Item {} = {}", i, x);}
}fn test2() {let items = ["a", "b", "c"];items.iter().enumerate().for_each(|(i, x)| {println!("Item {} = {}", i, x);});
}
7. 迭代器方法的区别
.into_iter() 和 .iter() 两个方法都用于创建迭代器,它们的区别在于:
1.所有权转移:.into_iter() 方法会消耗当前的集合,并将所有权转移给迭代器。这意味着在迭代完成后,原集合将不再可用。而 .iter() 方法不会消耗集合,它只是创建一个新的迭代器,你可以在迭代完成后继续使用原集合。
2.消耗和产生元素:.into_iter() 会消耗集合中的元素,并将它们放入迭代器中。这意味着每次调用迭代器的 next() 方法都会消耗集合中的一个元素。而 .iter() 只是产生元素的引用,并不会消耗集合中的元素。
3.用途:当你需要遍历集合中的元素并获取它们的所有权时,应该使用 .into_iter()。当你只需要读取集合中的元素而不消耗它们时,应该使用 .iter()。
8. for_each() 用法
fn main() {// 迭代一个 vec 并打印每个元素 let vec = vec![1, 2, 3, 4, 5]; vec.iter().for_each(|x| print!("{} ", x));println!();// 迭代一个字符串并打印每个字符 let s = "hello"; s.chars().for_each(|c| print!("{} ", c));println!();// 迭代一个 vec 并将其元素加倍 let mut v1 = vec![1, 2, 3, 4, 5];let mut v2 = vec![];v1.iter().for_each(|x| v2.push(x * 2)); println!("{:?}", v2);v1.clone().iter().for_each(|x| v1.push(x * 2)); println!("{:?}", v1);
}
输出:
1 2 3 4 5
h e l l o
[2, 4, 6, 8, 10]
[1, 2, 3, 4, 5, 2, 4, 6, 8, 10]
9. 分离奇数和偶数
.filter() 方法是一个在标准库中的std::iter::Iterator trait的默认方法。这个方法会创建一个新的迭代器,包含所有满足给定条件的元素。
示例:分离一个数组中的奇数和偶数
fn main() {let mut vec = vec![1, 2, 3, 4, 5]; vec.clone().iter().for_each(|x| vec.push(x + 5)); println!("{:?}", vec);fn is_even(x: &i32) -> bool { *x % 2 == 0 }fn print_x(x: &i32) { print!("{} ", x) }vec.iter().filter(|x| !is_even(x)).for_each(|x| print_x(x));println!();vec.iter().filter(|x| is_even(x)).for_each(|x| print_x(x));println!();
}
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1 3 5 7 9
2 4 6 8 10
10. 判断素数(质数)
.any() 方法是一个在标准库中的std::iter::Iterator trait的默认方法。这个方法会检查迭代器中是否有元素满足给定的条件,如果有元素满足条件,它就会返回true,否则返回false。
示例:求30以内的质数
fn is_prime(n: u64) -> bool {match n {0..=1 => false,_ => !(2..n).any(|d| n % d == 0),}
}fn main() {for i in 1..=30 {if is_prime(i) {print!("{} ", i);}}println!();
}
输出:
2 3 5 7 11 13 17 19 23 29
相关阅读:
Rust 编程小技巧摘选(1)_Hann Yang的博客-CSDN博客
Rust 编程小技巧摘选(2)_Hann Yang的博客-CSDN博客
Rust 编程小技巧摘选(3)_Hann Yang的博客-CSDN博客
Rust 编程小技巧摘选(4)_Hann Yang的博客-CSDN博客
Rust 编程小技巧摘选(5)_Hann Yang的博客-CSDN博客
相关文章:

Rust 编程小技巧摘选(6)
目录 Rust 编程小技巧(6) 1. 打印字符串 2. 重复打印字串 3. 自定义函数 4. 遍历动态数组 5. 遍历二维数组 6. 同时遍历索引和值 7. 迭代器方法的区别 8. for_each() 用法 9. 分离奇数和偶数 10. 判断素数(质数) Rust 编程小技巧(6) 1. 打印…...
如何保证Redis缓存和数据库的一致性问题
熟练掌握Redis缓存技术? 那么请问Redis缓存中有几种读写策略,又是如何保证与数据库的一致性问题 今天来聊一聊常用的三种缓存读写策略 Cache Aside Pattern Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式,比较适合读请求比…...

【数据分析入门】人工智能、数据分析和深度学习是什么关系?如何快速入门 Python Pandas?
目录 一、前言二、数据分析和深度学习的区别三、人工智能四、深度学习五、Pandas六、Pandas数据结构6.1 Series - 序列6.2 DataFrame - 数据框 七、输入、输出7.1 读取/写入CSV7.2 读取/写入Excel7.3 读取和写入 SQL 查询及数据库表 八、调用帮助九、选择(这里可以参考上一篇文…...
JavaScript 里三个点 ... 的用法
// table表头数据let tableHeadData deepClone(data);let tableCacheData [];//表格缓存对比if (!parent && isCacheHeadData) {// 缓存数据keylet tableCacheKey ${window.location.pathname}-${$self.attr(id)}if (localStorage.getItem(tableCacheKey)) {//根据缓…...

Linux修改系统语言
sudo dpkg-reconfigure locales 按pagedown键,移动红色光标到 zh_CN.UTF-8 UTF-8,空格标记*号(没标记下一页没有这一项),回车。 下一页选择 zh_CN.UTF-8。 如果找不到 dpkg-reconfigure whereis dpkg-reconfigure …...

Spring注解开发
目录 1、简介 2、原始注解 2.1、注解种类 2.2、组件扫描 2.3、具体使用 2.3.1、xml配置 2.3.2、注解配置 3、⭐新注解 3.1、新注解种类 3.2、实践 3.3、运行结果 3.4、警告信息 1、简介 Spring框架提供了许多注解,用于在Java类中进行配置和标记…...

图像处理库(Opencv, Matplotlib, PIL)以及三者之间的转换
文章目录 1. Opencv2. Matplotlib3. PIL4. 三者的区别和相互转换5. Torchvision 中的相关转换库5.1 ToPILImage([mode])5.2 ToTensor5.3 PILToTensor 1. Opencv opencv的基本图像类型可以和numpy数组相互转化,因此可以直接调用torch.from_numpy(img) 将图像转换成t…...
html+Vue+封装axios实现发送请求
在html中使用Vue和Axios时,可以在HTML中引入Vue库和Axios库,然后使用Vue的语法和指令来创建Vue组件和模板。在Vue组件中,你可以使用Axios发送HTTP请求来获取数据,并将数据绑定到Vue模板中进行展示。 <template><div>&…...
GoogLeNet卷积神经网络输出数据形参分析-笔记
GoogLeNet卷积神经网络输出数据形参分析-笔记 分析结果为: 输入数据形状:[10, 3, 224, 224] 最后输出结果:linear_0 [10, 1] [1024, 1] [1] 子空间执行逻辑 def forward_old(self, x):# 支路1只包含一个1x1卷积p1 F.relu(self.p1_1(x))# 支路2包含 1…...

【docker】dockerfile发布springboot项目
目录 一、实现步骤二、示例 一、实现步骤 1.定义父镜像:FROM java:8 2.定义作者信息:MAINTAINER:learn_docker<https://www.docker.com> 3.将jar包添加到容器:ADD jar包名称.jar app.jar 4.定义容器启动执行命令:…...
利用docker run -v 命令实现使用宿主机中没有的命令
利用docker run -v 命令实现使用宿主机中没有的命令 使用容器中的jar命令解压jar包,并将解压内容输出到挂载在宿主机中的目录里 使用容器中的jar命令解压jar包,并将解压内容输出到挂载在宿主机中的目录里 docker run -it --name java -v /www/temp/java…...

【小沐学NLP】在线AI绘画网站(百度:文心一格)
文章目录 1、简介2、文心一格2.1 功能简介2.2 操作步骤2.3 使用费用2.4 若干示例2.4.1 女孩2.4.2 昙花2.4.3 山水画2.4.4 夜晚2.4.5 古诗2.4.6 二次元2.4.7 帅哥 结语 1、简介 当下,越来越多AI领域前沿技术争相落地,逐步释放出极大的产业价值࿰…...
react经验5:访问子组件内容
应用场景 父级需要调用子组件的某函数 实现步骤 案例:创建自定义按钮 button.tsx import { Ref, forwardRef, useImperativeHandle,ReactNode} from "react" declare type ButtonProps {/**按钮文字 */children?: ReactNode,onClick?: () > voi…...

【LeetCode】647. 回文子串
题目链接 文章目录 1. 思路讲解1.1 方法选择1.2 dp表的创建1.3 状态转移方程1.4 填表顺序 2. 代码实现 1. 思路讲解 1.1 方法选择 这道题我们采用动态规划的解法,倒不是动态规划的解法对于这道题有多好,它并不是最优解。但是,这道题的动态…...
Open3D(C++) 角度制与弧度制的相互转换
目录 一、弧度转角度1、计算公式2、主要函数3、示例代码4、结果展示二、角度转弧度1、计算公式2、主要函数3、示例代码4、结果展示三、归一化到(-PI,PI)1、主要函数<...

【小沐学NLP】在线AI绘画网站(网易云课堂:AI绘画工坊)
文章目录 1、简介1.1 参与方式1.2 模型简介 2、使用费用3、操作步骤3.1 选择模型3.2 输入提示词3.3 调整参数3.4 图片生成 4、测试例子4.1 小狗4.2 蜘蛛侠4.3 人物4.4 龙猫 结语 1、简介 Stable Diffusion是一种强大的图像生成AI,它可以根据输入的文字描述词&#…...
GNN code Tips
1. 重置label取值范围 problem: otherwise occurs IndexError: target out of bounds # reset labels value range, otherwise occurs IndexError: target out of bounds uni_set torch.unique(labels) to_set torch.tensor(list(range(len(uni_set)))) labels_reset label…...

物联网|按键实验---学习I/O的输入及中断的编程|函数说明的格式|如何使用CMSIS的延时|读取通过外部中断实现按键捕获代码的实现及分析-学习笔记(14)
文章目录 通过外部中断实现按键捕获代码的实现及分析Tip1:函数说明的格式Tip2:如何使用CMSIS的延时GetTick函数原型stm32f407_intr_handle.c解析中断处理函数:void EXTI4_IRQHandler 调试流程软件模拟调试 两种代码的比较课后作业: 通过外部中断实现按键捕获代码的实…...

Java对象的前世今生
文章目录 一、创建对象的步骤二、类加载机制三、内存分配指针碰撞 (内存连续)空闲列表 (内存不连续) 四、创建对象的5种方法五、浅拷贝与深拷贝 以下一行代码内部发生了什么? Person person new Person();一、创建对象的步骤 根据JLS中的规定,Java对象…...
Qt中JSON的使用
一.前言: JSON是一种轻量级数据交换格式,常用于客户端和服务端的数据交互,不依赖于编程语言,在很多编程语言中都可以使用JSON,比如C,C,Java,Android,Qt。除了JSON&#x…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...