番外 -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> 这种写法,特别是在泛型类型的上下文中,表示显式地指定泛型参数的类型。它在编写更复杂的代码时非常有用,帮助编译器明确知道你期望的类型是什么。

浙公网安备 33010602011771号