在 Rust 中,::
和 .
是两种常用的操作符,它们的作用和语法用途不同。以下是详细的对比和解释:
1. ::
(双冒号)
::
是 路径操作符,主要用于访问模块、结构体、枚举、函数、常量等的命名空间中的成员。
主要用途
-
模块路径
用于引用模块或模块中的项:mod math { pub fn add(a: i32, b: i32) -> i32 { a + b } } fn main() { let result = math::add(5, 3); // 使用 :: 引用模块中的函数 println!("Result: {}", result); }
-
枚举成员
用于访问枚举的变体:enum Direction { Up, Down, Left, Right, } fn main() { let dir = Direction::Up; // 使用 :: 引用枚举变体 }
-
静态方法和关联函数
用于调用结构体、枚举或其他类型的静态方法或关联函数:struct MyStruct; impl MyStruct { fn new() -> MyStruct { MyStruct } } fn main() { let instance = MyStruct::new(); // 调用关联函数 }
-
常量和静态变量
用于访问模块或类型中的常量和静态变量:const PI: f64 = 3.14159; fn main() { println!("Value of PI: {}", PI); }
2. .
(点操作符)
.
是 成员访问操作符,主要用于访问实例的属性和方法。
主要用途
-
访问结构体字段
用于访问结构体实例的字段:struct Point { x: i32, y: i32, } fn main() { let point = Point { x: 10, y: 20 }; println!("Point: ({}, {})", point.x, point.y); // 使用 . 访问字段 }
-
调用方法
用于调用实例方法(非关联函数):struct Circle { radius: f64, } impl Circle { fn area(&self) -> f64 { 3.14159 * self.radius * self.radius } } fn main() { let circle = Circle { radius: 5.0 }; println!("Area: {}", circle.area()); // 使用 . 调用实例方法 }
-
链式调用
可以使用点操作符链式调用多个方法:fn main() { let text = "hello".to_uppercase().replace("HELLO", "Hi"); println!("{}", text); // 输出:Hi }
总结对比
操作符 | 用途 | 示例 |
---|---|---|
:: | 用于访问命名空间中的成员,例如模块、函数、枚举变体、关联函数、常量等 | std::io::stdin 、Vec::new 、Option::Some |
. | 用于访问实例的字段或方法 | instance.field 、instance.method() |
综合示例
以下代码展示了 ::
和 .
的综合用法:
struct MyStruct;
impl MyStruct {
fn new() -> MyStruct { // 关联函数
MyStruct
}
fn instance_method(&self) { // 实例方法
println!("Called instance method");
}
}
fn main() {
// 使用 :: 调用关联函数
let instance = MyStruct::new();
// 使用 . 调用实例方法
instance.instance_method();
}
输出
Called instance method
通过这些示例可以清楚地看到 ::
和 .
的区别:
::
是静态路径,用于访问命名空间内的内容。.
是动态访问,用于实例的字段或方法。