Rust 编程小技巧摘选(7)

这篇具有很好参考价值的文章主要介绍了Rust 编程小技巧摘选(7)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Rust 编程小技巧摘选(7),Rust,rust,开发语言,后端

目录

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博客文章来源地址https://www.toymoban.com/news/detail-631959.html

到了这里,关于Rust 编程小技巧摘选(7)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust 编程小技巧摘选(4)

    使用 std::fs 模块 Rust 的 std::fs 模块提供了许多方便的函数,可以用于读写文件和目录。使用 std::fs 可以避免使用不安全的 C 函数,提高代码的可读性和可维护性。 使用 lazy_static 宏 lazy_static 宏可以用于定义全局静态变量,该变量的值只会在首次使用时计算。这可以避免不必要

    2024年02月14日
    浏览(36)
  • Rust编程语言入门之Rust的面向对象编程特性

    Rust 受到多种编程范式的影响,包括面向对象 面向对象通常包含以下特性:命名对象、封装、继承 “设计模式四人帮”在《设计模型》中给面向对象的定义: 面向对象的程序由对象组成 对象包装了数据和操作这些数据的过程,这些过程通常被称作方法或操作 基于此定义:

    2023年04月21日
    浏览(38)
  • 【Rust 基础篇】Rust FFI:连接Rust与其他编程语言的桥梁

    Rust是一种以安全性和高效性著称的系统级编程语言,具有出色的性能和内存安全特性。然而,在现实世界中,我们很少有项目是完全用一种编程语言编写的。通常,我们需要在项目中使用多种编程语言,特别是在与现有代码库或底层系统交互时。为了实现跨语言的互操作性,

    2024年02月15日
    浏览(38)
  • Rust编程语言入门之高级特性

    不安全 Rust 高级 Trait 高级 类型 高级函数和闭包 宏 隐藏着第二个语言,它没有强制内存安全保证:Unsafe Rust(不安全的 Rust) 和普通的 Rust 一样,但提供了额外的“超能力” Unsafe Rust 存在的原因: 静态分析是保守的。 使用 Unsafe Rust:我知道自己在做什么,并承担相应风险

    2023年04月24日
    浏览(38)
  • Rust编程语言入门之无畏并发

    Concurrent:程序的不同部分之间独立的执行(并发) Parallel:程序的不同部分同时运行(并行) Rust无畏并发:允许你编写没有细微Bug的代码,并在不引入新Bug的情况下易于重构 注意:本文中的”并发“泛指 concurrent 和 parallel 在大部分OS里,代码运行在进程(process)中,OS同时

    2023年04月19日
    浏览(57)
  • Rust编程语言入门之智能指针

    指针:一个变量在内存中包含的是一个地址(指向其它数据) Rust 中最常见的指针就是”引用“ 引用: 使用 借用它指向的值 没有其余开销 最常见的指针类型 智能指针是这样一些数据结构: 行为和指针相似 有额外的元数据和功能 通过记录所有者的数量,使一份数据被多个

    2023年04月16日
    浏览(38)
  • Rust编程语言入门之模式匹配

    模式是Rust中的一种特殊语法,用于匹配复杂和简单类型的结构 将模式与匹配表达式和其他构造结合使用,可以更好地控制程序的控制流 模式由以下元素(的一些组合)组成: 字面值 解构的数组、enum、struct 和 tuple 变量 通配符 占位符 想要使用模式,需要将其与某个值进行

    2023年04月22日
    浏览(79)
  • 如何在 macOS 上安装 Rust 编程语言

    安装Rust编程语言在Mac上是一个相对简单的过程,但它可能会涉及多个步骤。在本文中,我将详细说明如何在Mac上安装Rust,并提供一些常见问题的解决方法。请注意,由于软件和工具可能会发生变化,因此建议首先查看Rust官方网站以获取最新的安装说明。 目录 1.打开终端 2

    2024年02月01日
    浏览(43)
  • 【跟小嘉学 Rust 编程】十七、面向对象语言特性

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学 Rust 编程】六、枚举

    2024年02月10日
    浏览(76)
  • 【编程】Rust语言入门第4篇 字符串

    Rust 中的字符是 Unicode 类型,因此每个字符占据 4 个字节内存空间,但字符串不一样,字符串是 UTF-8 编码,也就是字符串中的字符所占的字节数是变化的(1 - 4)。 常见的字符串有两种: str,通常是引用类型, str ,即字符串字面常量,字符串切片。 std::string::String 类型 str 的变

    2024年02月20日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包