Rust 编程小技巧摘选(7)

Rust 编程小技巧(7)

1. 结构体 Display trait

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

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

rust 复制代码
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)

2. HashMap 和 BTreeMap

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

都支持使用 Vec 或 String 作为键,也支持使用标准库中的其他结构体作为键。

都支持使用 Option 类型作为键值对中的值。

都支持使用 HashMap 类型的成员函数来进行基本的操作,例如插入、删除、查找、更新等。

不同点:

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

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

示例:

rust 复制代码
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}

3. 遍历输出哈希表

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

rust 复制代码
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


​​​​​​​相关阅读:

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

相关推荐
hello早上好12 分钟前
Spring不同类型的ApplicationContext的创建方式
java·后端·架构
roman_日积跬步-终至千里13 分钟前
【Go语言基础【20】】Go的包与工程
开发语言·后端·golang
@一枝梅32 分钟前
vue3 vite.config.js 引入bem.scss文件报错
javascript·rust·vue·scss
秦少游在淮海33 分钟前
C++ - string 的使用 #auto #范围for #访问及遍历操作 #容量操作 #修改操作 #其他操作 #非成员函数
开发语言·c++·stl·string·范围for·auto·string 的使用
const54441 分钟前
cpp自学 day2(—>运算符)
开发语言·c++
心扬42 分钟前
python生成器
开发语言·python
阿蒙Amon1 小时前
06. C#入门系列【自定义类型】:从青铜到王者的进阶之路
开发语言·c#
虾球xz1 小时前
CppCon 2015 学习:CLANG/C2 for Windows
开发语言·c++·windows·学习
CodeWithMe1 小时前
【C/C++】namespace + macro混用场景
c语言·开发语言·c++
00后程序员2 小时前
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
后端