Rust模块关键词和哈希表详解

 更新时间:2026年03月10日 15:24:06   作者:Mem0rin  
文章介绍了Rust编程语言中模块系统、路径控制、as关键字、外部包的使用以及哈希表的操作,主要涵盖了如何通过pub关键字控制模块和结构体的可见性,文章还详细讲解了哈希表的创建、访问、所有权转移、更新操作,感兴趣的朋友一起看看吧

模块

一、pub:公有化

mod front_of_house {
    pub mod hosting {
        //这里的pub是让这个模块公有化,也就是说可以通过 crate::front_of_house::hosting::访问模块中的元素
        pub fn add_to_waitlist() {}//但是模块内部的元素是否公有化仍然是需要pub关键字指明的,并且我们知道这样是合理的,因为这样我们对模块内部的元素哪些需要公开,哪些需要私有有更精准的把控。
    }
}
pub fn eat_at_restaurant() {
    // 绝对路径
    crate::front_of_house::hosting::add_to_waitlist();
    // 相对路径
    front_of_house::hosting::add_to_waitlist();
}

结构体和枚举的公有化

我们也可以用pub来设计公有的结构体和枚举,如果我们在结构体的定义前加入了pub关键词,那么结构体就是公有的,但是内部的字段仍然是私有的,也要通过pub来控制哪些要公有哪些要私有。(比如QQ你可以选择公开自己的性别生日,但是不会公开身份证号((。

super:从父模块开始的相对路径

fn deliver_order() {}
mod back_of_house {
    fn fix_incorrect_order() {
        cook_order();
        super::deliver_order();
    }
    fn cook_order() {}
}

依然是作用域的概念,super关键字把路径的起点返回到了父模块的作用域,比如上面的代码本来在模块back_of_house的作用域内,super返回到了crate作用域,从而就可以直接访问deliver_order()了。

二、as提供新名称:

use std::fmt::Result;
use std::io::Result as IoResult

三、使用外部包:

1.在Cargo.toml加入对应依赖

rand = "0.8.5"

2.用use引入:

use rand::Rng
fn main() {
    let secret_number = rand::thread_rng().gen_range(1..=100);
}

嵌套路径:

use std::cmp::Ordering;
use std::io;
//等价于
use std::{cmp::Ordering, io};
use std::io;
use std::io::Write;
//等价于
use std::io::{self, Write};

HashMap

相当于py的字典,不同的是哈希表也是同质的,也就是所有的键都得是一个类型,所有的值也得是一个类型。

一、新建哈希map:

use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);

二、访问哈希map的值:

get

use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
let team_name = String::from("Blue");
let score = scores.get(&team_name).copied().unwrap_or(0);

for循环遍历:

use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
for (key, value) in &scores {
    println!("{key}: {value}");
}

三、所有权:

对于像 i32 这样的实现了 Copy trait 的类型,其值可以拷贝进哈希 map。对于像 String 这样拥有所有权的值,其值将被移动而哈希 map 会成为这些值的所有者。

use std::collections::HashMap;
let field_name = String::from("Favorite color");
let field_value = String::from("Blue");
let mut map = HashMap::new();
map.insert(field_name, field_value);
// 这里 field_name 和 field_value 不再有效,
// 尝试使用它们看看会出现什么编译错误!

因为涉及所有权的转移,因此在调用insert之后,field_name, field_value将不能使用。

如果将值的引用插入哈希map中,这些值本身不会移动到哈希map中,但至少要保证但是这些引用指向的值在哈希 map 有效时也是有效的。

四、更新哈希map:

1.覆盖:对同一个键用两次insert即可

2.只在键尚未存在时插入键值对:(如果键存在不进行任何操作,如果不存在则连同值一起插入)

方法是调用entryAPI,返回值是一个枚举Entry,代表了可能存在也可能不存在的值。

Entryor_insert方法在键对应的值存在的时候会返回键的可变引用,不存在则把参数插入。

use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.entry(String::from("Yellow")).or_insert(50);
scores.entry(String::from("Blue")).or_insert(50);
println!("{scores:?}");

or_insert返回的可变引用可以用于更新旧值,具体如下:

use std::collections::HashMap;
let text = "hello world wonderful world";
let mut map = HashMap::new();
for word in text.split_whitespace() {
    let count = map.entry(word).or_insert(0);
    *count += 1;
}
println!("{map:?}");

到此这篇关于Rust模块关键词和哈希表详解的文章就介绍到这了,更多相关Rust模块关键词和哈希表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 详解Rust中的所有权机制

    详解Rust中的所有权机制

    Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码,这篇文章主要介绍了Rust中的所有权机制,需要的朋友可以参考下
    2022-10-10
  • 详解Rust中#[derive]属性怎么使用

    详解Rust中#[derive]属性怎么使用

    在 Rust 中,#[derive] 是一个属性,用于自动为类型生成常见的实现,下面就跟随小编一起来学习一下Rust中derive属性的具体使用吧
    2024-11-11
  • Rust中字符串与格式化操作方法

    Rust中字符串与格式化操作方法

    Rust提供了多种字符串类型和强大的格式化工具,主要有两种字符串类型:&str(字符串切片)和String(动态字符串),二者均基于UTF-8 编码,本文重点介绍Rust中字符串与格式化的相关知识,感兴趣的朋友一起看看吧
    2025-10-10
  • 解读Rust的Rc<T>:实现多所有权的智能指针方式

    解读Rust的Rc<T>:实现多所有权的智能指针方式

    Rc<T> 是 Rust 中用于多所有权的引用计数类型,通过增加引用计数来管理共享数据,只有当最后一个引用离开作用域时,数据才会被释放,Rc<T> 适用于单线程环境,并且只允许不可变共享数据;需要可变共享时应考虑使用 RefCell<T> 或其他解决方案
    2025-02-02
  • Rust的slab库使用场景分析

    Rust的slab库使用场景分析

    slab 是一个轻量级、高性能的工具,非常适合管理固定大小的资源集合,尤其是在网络编程和事件驱动架构中,这篇文章主要介绍了Rust的slab库使用教程,需要的朋友可以参考下
    2024-12-12
  • 深入了解Rust中函数与闭包的使用

    深入了解Rust中函数与闭包的使用

    本文主要介绍一下Rust函数相关的内容,首先函数我们其实一直都在用,所以函数本身没什么可说的,我们的重点是与函数相关的闭包、高阶函数、发散函数,感兴趣的可以学习一下
    2022-11-11
  • rust 中生成与使用protobuf的方法

    rust 中生成与使用protobuf的方法

    这篇文章主要介绍了rust中protobuf生成与使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Rust中vector的详细用法

    Rust中vector的详细用法

    Rust和C++同样也有vector概念,本文主要介绍了Rust中vector的详细用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Rust duckdb和polars读csv文件比较情况

    Rust duckdb和polars读csv文件比较情况

    duckdb在数据分析上,有非常多不错的特质,1、快;2、客户体验好,特别是可以同时批量读csv在一个目录下的csv等文件,今天来比较下Rust duckdb和polars读csv文件比较的情况,感兴趣的朋友一起看看吧
    2024-06-06
  • 一文学会Rust语言如何操作JSON

    一文学会Rust语言如何操作JSON

    JSON在Web开发中被广泛应用于数据交换,本文主要介绍了Rust语言操作JSON,包括序列化、反序列化、JSON创建等多个方面,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03

最新评论