Rust 编程小技巧摘选(7)

eb88291a18a94ba4ace118fb4e46ef23.png

目录

Rust 编程小技巧(7)

1. 交换变量

2. 翻转数组

3. for_each() 用法

4. 结构体 Display trait

5. HashMap 和 BTreeMap

6. 遍历输出哈希表

7. 分离奇数和偶数

8. 判断素数(质数)


Rust 编程小技巧(7)

1. 交换变量

与python, go等语言用法类似,不同的是rust不能省掉元组的括号 () 。

fn main() {let a = 3;let b = 23;println!("a: {}, b: {}", a, b);let (a, b) = (b, a);println!("a: {}, b: {}", a, b);
}

输出:

a: 3, b: 23
a: 23, b: 3

2. 翻转数组

fn main() {let x = vec!["Hello", "World"];let y: Vec<_> = x.iter().rev().collect();println!("{:?}\n{:?}", x, y);let mut z = vec![1,2,3];println!("{:?}", z);z.reverse();println!("{:?}", z);
}

输出:

["Hello", "World"]
["World", "Hello"]
[1, 2, 3]
[3, 2, 1] 

3. 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]

4. 结构体 Display trait

结构体的两种形式,对应的成员取法不同;

前者用 self.成员变量名 self.x, self.y;后者用 self.成员索引号 self.0, self.1, self.2, ......

use std::fmt::Display;
use std::fmt::Result;
use std::fmt::Formatter;struct Point {x: f64,y: f64,
}struct Point2(f64, f64);impl Display for Point {fn fmt(&self, f: &mut Formatter<'_>) -> Result {write!(f, "({}, {})", self.x, self.y)}
}impl Display for Point2 {fn fmt(&self, f: &mut Formatter<'_>) -> Result {write!(f, "({}, {})", self.0, self.1)}
}fn main() {let p = Point { x: 2.0, y: -3.5 };println!("{}", p);let p = Point2(2.0, -3.5);println!("{}", p);
}

 输出:

(2, -3.5)
(2, -3.5)

5. HashMap 和 BTreeMap

两者都是 Rust 中的哈希表数据结构,它们的相同点:

都支持使用 Vec 或 String 作为键,也支持使用标准库中的其他结构体作为键。
都支持使用 Option 类型作为键值对中的值。
都支持使用 HashMap 类型的成员函数来进行基本的操作,例如插入、删除、查找、更新等。

不同点:

HashMap 使用哈希表(HashMap)算法来存储键值对,而 BTreeMap 使用 B-TREE(B 树)算法来存储键值对。因此,BTreeMap 在查找、插入、删除等操作上的性能比 HashMap 更好。

如果需要使用哈希表(HashMap)数据结构,但不需要按照键值对的顺序来访问,而且对查找、插入、删除等操作的性能要求不高,那么可以使用 HashMap。如果需要使用哈希表(HashMap)数据结构,而且对查找、插入、删除等操作的性能要求较高,而且需要按照键值对的顺序来访问,那么可以使用 BTreeMap。

示例:

use std::collections::BTreeMap;
use std::collections::HashMap;fn main() {let mut x = BTreeMap::new();x.insert("one", 1);x.insert("two", 2);println!("{:?}", x);let x: HashMap<&str, i32> = [("one", 1),("two", 2),].iter().cloned().collect();println!("{:?}", x);
}

输出:

{"one": 1, "two": 2}
{"one": 1, "two": 2}

6. 遍历输出哈希表

在for...in...循环结构中使用元组(k, v)读取对应键值对:

use std::collections::BTreeMap;
use std::collections::HashMap;fn main() {let mut x = BTreeMap::new();x.insert("one", 1);x.insert("two", 2);x.insert("three", 3);x.insert("four", 4);for (k, v) in &x {println!("Key={}, Value={}", k, v);}println!();let x: HashMap<&str, i32> = [("one", 1),("two", 2),("three", 3),("four", 4),].iter().cloned().collect();for (k, v) in &x {println!("Key={key}, Value={val}", key = k, val = v);}
}

输出:

Key=four, Value=4
Key=one, Value=1
Key=three, Value=3
Key=two, Value=2

Key=three, Value=3
Key=two, Value=2
Key=one, Value=1
Key=four, Value=4

7. 分离奇数和偶数

.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  

8. 判断素数(质数)

.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)_Hann Yang的博客-CSDN博客

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

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

相关文章

计算机网络:网络字节序

目录 一、字节序1.字节序概念2.字节序的理解&#xff08;1&#xff09;大端模式存储数据&#xff08;2&#xff09;小端模式存储数据 二、网络字节序 一、字节序 1.字节序概念 字节序&#xff1a;内存中存储多字节数据的顺序。 难道存储数据还要看顺序吗&#xff1f; yes。内…

【将回声引入信号中】在语音或音频文件中引入混响或简单回声,以研究回声延迟和回波幅度对生成的回波信号感知的影响(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java 正则表达式【匹配与分组基本原理】

简介 我们一般使用正则表达式是用来处理字符串的&#xff0c;不管是实际的开发中还是我们的算法竞赛中&#xff0c;使用正则表达式绝对可以大大提升我们的效率。 正则表达式&#xff08;regular expression&#xff09;其实就是对字符串进行模式匹配的技术。 快速入门 我们这里…

第三篇|金融人数据来源有哪些

数据对于金融行业真的很重要&#xff0c;那么金融人有哪些途径查数据呢&#xff1f; 国内&#xff1a; 1. 国家统计局 这个应该是无论什么行业都使用最频繁的网站&#xff0c;每个月都会固定发上个月资产投资数据 、工业增加值和利润数据等常规数据&#xff0c;其他数据也会…

什么是分布式系统,如何学习分布式系统

正文 虽然本人在前面也写过好几篇分布式系统相关的文章&#xff0c;主要包CAP理论&#xff0c;分布式储存与分布式事务&#xff0c;但对于分布式系统&#xff0c;并没有一个跟清晰的概念。分布式系统涉及到很多的技术、理论与协议&#xff0c;很多人也说&#xff0c;分布式系统…

Docker 安装和架构说明

Docker 并非是一个通用的容器工具&#xff0c;它依赖于已存在并运行的Linux内核环境。 Docker实质上是在已经运行的Liunx下制造了一个隔离的文件环境&#xff0c;因此他的执行效率几乎等同于所部署的linux主机。因此Docker必须部署在Linux内核系统上。如果其他系统想部署Docke…

hutool 导出复杂表头excel

假如已这样的表头导出数据 1.把包含表头的excel添加到项目资源目录 2.编写代码读取表头所在sheet,并且加入需导出的数据 /*** 导出excel*/public static void downloadExcel(List<List<Object>> list, HttpServletResponse response) throws IOException {/*Strin…

wpf 3d 坐标系和基本三角形复习

wpf 3d 坐标系的描述见此&#xff0c; WPF 3d坐标系和基本三角形_wpf 坐标系_bcbobo21cn的博客-CSDN博客 X轴正向向右&#xff0c;Y轴正向向上&#xff1b;Z轴&#xff0c;正向是从屏幕里边出来&#xff0c;负向是往屏幕里边去&#xff1b;坐标原点是在呈现区域的中心&#x…

知识付费系统开发:构建高效智能的付费内容平台

随着数字化时代的来临&#xff0c;知识付费正迅速崭露头角&#xff0c;为知识创作者和求知者带来了全新的商机。在这个背景下&#xff0c;开发一款高效智能的知识付费系统成为了一项重要的任务。本文将深入探讨如何基于Python编程语言和相关技术构建一个智能的知识付费内容平台…

mac arm 通过brew搭建 php+nginx+mysql+xdebug

1.安装nginx brew install nginx //安装brew services start nginx //启动2.安装php brew install php7.4 //安装export PATH"/opt/homebrew/opt/php7.4/bin:$PATH" //加入环境变量 export PATH"/opt/homebrew/opt/php7.4/sbin:$PATH"brew serv…

【百度翻译api】中文自动翻译为英文

欸&#xff0c;最近想做一些nlp的项目&#xff0c;做完了中文的想做做英文的&#xff0c;但是呢&#xff0c;国内爬虫爬取的肯定都是中文 &#xff0c;爬取外网的技术我没有尝试过&#xff0c;没有把握。所以我决定启用翻译&#xff0c;在这期间chatGPT给了我非常多的方法&…

【枚举】CF1660 D

Problem - 1660D - Codeforces 题意&#xff1a; 思路&#xff1a; 思路巨简单&#xff0c;代码也wa了很多发才过&#xff0c;都是因为细节.... 很显然&#xff0c;要根据0分段处理 对于每一段&#xff0c;枚举去掉左边段还是右边段&#xff0c;左边段是 l 到第一个负数&am…

网络加速与文件传输软件:如何通过优化网络提升文件传输速度

在信息化社会&#xff0c;文件传输是人们生活和工作中必不可少的一个环节。但是&#xff0c;由于网络环境的多样性和传输过程中可能出现的各种问题&#xff0c;文件传输速度经常受到影响。因此&#xff0c;如何优化网络以提高文件传输速度成为了一个重要的课题。本文将探讨网络…

力扣:59. 螺旋矩阵 II(Python3)

题目&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全…

windows使用/服务(13)戴尔电脑怎么设置通电自动开机

戴尔pc机器通电自启动 1、将主机显示器键盘鼠标连接好后&#xff0c;按主机电源键开机 2、在开机过程中按键盘"F12",进入如下界面&#xff0c;选择“BIOS SETUP” 3、选择“Power Management” 4、选择“AC Recovery”&#xff0c;点选“Power On”&#xff0c;点击“…

解决:django设置DEBUG=false时出现的问题

首先&#xff0c;我用的是django4.2&#xff0c;python3.10版本 本来&#xff0c;如果在settings.py中使用 DEBUG True&#xff0c;那么什么问题也没有&#xff0c;当然&#xff0c;这属于调试模式。 DEBUG True TEMPLATE_DEBUG DEBUGSTATIC_URL /static/ STATICFILES_DI…

七. 定时器

定时器 1. EPIT定时器(1) 特征&#xff1a;(2) 结构&#xff1a;(3) 工作模式&#xff1a;(4) 寄存器(5) 配置步骤(6) 定时器消抖 2. GPT 定时器(1) 特征(2) 结构(3) 工作模式(4) 寄存器<1> GPTx_CR 配置<2> GPTx_PR 分频<3> GPTx_SR 状态<4> GPTx_CNT…

Java集合知识回顾:从分类到工具类,掌握精髓

文章目录 1. 集合的分类2. Collection 接口3. Map 接口4. 泛型5. Collections 工具类总结 在Java编程世界中&#xff0c;集合是一项极为重要的知识&#xff0c;为我们的程序设计提供了强大的数据结构和处理手段。在本篇文章中&#xff0c;我们将回顾集合的分类以及相关的重要概…

接口测试自动化:简化测试流程,提升效率

接口测试自动化&#xff1a;简化测试流程&#xff0c;提升效率 什么是接口测试自动化&#xff1f; 接口测试自动化是指使用特定的工具和技术来自动化执行接口测试的过程。通过编写脚本&#xff0c;自动化工具可以模拟用户与软件系统的交互&#xff0c;验证接口的功能和性能。…

web应用越用越卡怎么办

简介 如果你的网页应用越用越卡,你就有理由怀疑存在内存泄露 在开发Web应用程序时&#xff0c;经常会遇到内存泄漏的问题&#xff0c;这可能导致应用程序的性能下降或崩溃。Chrome浏览器提供了一个内存面板&#xff0c;可以帮助我们识别并解决这些问题。本文将介绍如何使用Chr…