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

posted @   代码世界faq  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示