Rust 编程小技巧摘选(6)

news/2025/2/2 1:42:34/

eb88291a18a94ba4ace118fb4e46ef23.png

目录

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博客


http://www.ppmy.cn/news/1008745.html

相关文章

记录 运维三剑客一件部署的的docker-compose,yml文件

CAdvisor: 收集 InfluxDB: 存储 Grafana&#xff1a; 展示 version: 3.1volumes:grafana_data: {}services:influxdb:image: tutum/influxdb:0.9restart: alwaysenvironment:- PRE_CREATE_DBcadvisorports:- "8083:8083"- "8086:8086"volumes:- ./data/inf…

解决群晖Transmission外网无法访问问题

文章目录 环境描述和问题现象问题分析具体方法 环境描述和 群晖内网ip为&#xff1a;192.168.1.6 域名为www.xxxx.xxx 公网ip为122.122.XX.XX 群晖中已配置ssl证书 transmission是社群套件安装的 问题现象 在家中使用192.168.1.6:9091可正常打开transmission的web页面 使用h…

spring boot中web容器配置

web容器配置 spring boot 默认的web容器是 tomcat&#xff0c;如果需要换成其他的 web 容器&#xff0c;可以如下配置。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 默…

Docker极速安装Jenkins

安装 Jenkins 是一个常见的任务&#xff0c;使用 Docker 进行安装可以简化该过程并确保环境一致性。以下是在 Docker 中安装 Jenkins 的详细步骤&#xff1a; 安装 Docker: 首先&#xff0c;请确保您已在目标机器上安装了 Docker。根据您的操作系统&#xff0c;可以在 Docker 官…

每天40min,我们一起用70天稳扎稳打学完《JavaEE初阶》——8/70 第八天【wait和notify】【wait和sleep】【单例模式】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔   如果大家觉得有帮助的话,感谢大家帮忙 点…

Django Rest_Framework(三)

文章目录 1. 认证Authentication2. 权限Permissions使用提供的权限举例自定义权限 3. 限流Throttling基本使用可选限流类 4. 过滤Filtering5. 排序Ordering6. 分页Pagination可选分页器 7. 异常处理 ExceptionsREST framework定义的异常 8. 自动生成接口文档coreapi安装依赖设置…

215. 数组中的第K个最大元素(快排+大根堆+小根堆)

题目链接&#xff1a;力扣 解题思路&#xff1a; 方法一&#xff1a;基于快速排序 因为题目中只需要找到第k大的元素&#xff0c;而快速排序中&#xff0c;每一趟排序都可以确定一个最终元素的位置。 当使用快速排序对数组进行降序排序时&#xff0c;那么如果有一趟排序过程…

websocket+node实现直播(弱鸡版)

心血历程 这部分主要是写在写这些的时候遇到的问题以及换思路的过程&#xff0c;可以之间看正文 在之前我也写过直播功能&#xff0c;并且与websocket相结合实现了直播弹幕。只不过直播是使用的腾讯云的&#xff0c;而不是手写的直播推流拉流&#xff0c;这次又有一个新的项目…