番外 -rust路径分隔符 ::
在 Rust 中,::
是 路径分隔符,它的作用是用于访问某个模块、类型、方法或关联函数。它的使用场景包括以下几种情况:
1. 访问类型或函数的关联项
::
用来访问某个类型(例如结构体、枚举、trait)的关联函数或者常量。例如,Vec::new()
访问Vec
类型的new
关联函数,i32::MAX
访问i32
类型的常量MAX
。
let v: Vec<i32> = Vec::new(); // 调用 Vec 的关联函数 new() let max_value = i32::MAX; // 访问 i32 类型的常量 MAX
2. 模块路径
- 用
::
访问模块中的项。在 Rust 中,你可以通过模块来组织代码,模块中的内容可以通过::
访问。例如,std::collections::HashMap
表示标准库中的collections
模块中的HashMap
类型。
use std::collections::HashMap; // 导入 std::collections 模块中的 HashMap
3. 关联函数和方法
-
使用
::
访问一个类型的 关联函数。关联函数是与类型相关的函数(通常是构造函数),它们通常在定义类型时作为类型的“静态”函数存在。 -
HashMap::new()
是HashMap
类型的一个关联函数,它用于创建一个新的空的HashMap
。
let mut map = HashMap::<&str, i32>::new(); // 使用 HashMap 的关联函数 new() 创建一个新的 HashMap
4. 泛型类型的显式类型标注
在你提到的 HashMap::<&str, TeamScores>::new()
中,::<&str, TeamScores>
是显式地指定了泛型类型参数。
HashMap
是一个泛型类型,它可以接受任意类型作为键和值类型。通过::<&str, TeamScores>
,你显式地指定了HashMap
中键的类型为&str
(字符串切片),值的类型为TeamScores
(某个自定义类型)。::
用于分隔类型和泛型参数的部分,它告诉编译器你要提供哪些具体的类型参数。
let mut scores = HashMap::<&str, TeamScores>::new();
这行代码创建了一个 HashMap
,键类型是 &str
,值类型是 TeamScores
。
5. 与 trait 配合使用
::
也用于调用某个 trait 的方法。假设你定义了一个 trait 并为类型实现了这个 trait,你可以使用::
来调用 trait 中的方法。
trait Speak { fn say(&self); } struct Dog; impl Speak for Dog { fn say(&self) { println!("Woof!"); } } // 调用 trait 方法 Dog::say(&Dog); // 这样调用 say 方法
6. 模块路径的访问
在 Rust 中,你可以用 ::
来访问模块中的函数、常量、类型等。
mod animals { pub fn dog() { println!("Woof!"); } } fn main() { animals::dog(); // 使用 :: 调用 animals 模块中的 dog 函数 }
::
和 其他符号的对比
.
:用于访问实例的字段或方法。例如,obj.method()
。::
:用于访问类型的关联函数、常量、或者模块中的项。例如,Vec::new()
或std::fs::File
。
总结
在 Rust 中,::
主要用于:
- 访问类型的关联函数或常量。
- 显式地指定泛型类型参数。
- 访问模块或 trait 中的内容。
::<Type>
这种写法,特别是在泛型类型的上下文中,表示显式地指定泛型参数的类型。它在编写更复杂的代码时非常有用,帮助编译器明确知道你期望的类型是什么。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】