Rust中::和.的区别

在 Rust 中,::. 是两种常用的操作符,它们的作用和语法用途不同。以下是详细的对比和解释:


1. ::(双冒号)

::路径操作符,主要用于访问模块、结构体、枚举、函数、常量等的命名空间中的成员。

主要用途
  • 模块路径

    用于引用模块或模块中的项:

    rust 复制代码
    mod math {
        pub fn add(a: i32, b: i32) -> i32 {
            a + b
        }
    }
    
    fn main() {
        let result = math::add(5, 3); // 使用 :: 引用模块中的函数
        println!("Result: {}", result);
    }
  • 枚举成员

    用于访问枚举的变体:

    rust 复制代码
    enum Direction {
        Up,
        Down,
        Left,
        Right,
    }
    
    fn main() {
        let dir = Direction::Up; // 使用 :: 引用枚举变体
    }
  • 静态方法和关联函数

    用于调用结构体、枚举或其他类型的静态方法或关联函数:

    rust 复制代码
    struct MyStruct;
    
    impl MyStruct {
        fn new() -> MyStruct {
            MyStruct
        }
    }
    
    fn main() {
        let instance = MyStruct::new(); // 调用关联函数
    }
  • 常量和静态变量

    用于访问模块或类型中的常量和静态变量:

    rust 复制代码
    const PI: f64 = 3.14159;
    
    fn main() {
        println!("Value of PI: {}", PI);
    }

2. .(点操作符)

.成员访问操作符,主要用于访问实例的属性和方法。

主要用途
  • 访问结构体字段

    用于访问结构体实例的字段:

    rust 复制代码
    struct Point {
        x: i32,
        y: i32,
    }
    
    fn main() {
        let point = Point { x: 10, y: 20 };
        println!("Point: ({}, {})", point.x, point.y); // 使用 . 访问字段
    }
  • 调用方法

    用于调用实例方法(非关联函数):

    rust 复制代码
    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()); // 使用 . 调用实例方法
    }
  • 链式调用

    可以使用点操作符链式调用多个方法:

    rust 复制代码
    fn main() {
        let text = "hello".to_uppercase().replace("HELLO", "Hi");
        println!("{}", text); // 输出:Hi
    }

总结对比

操作符 用途 示例
:: 用于访问命名空间中的成员,例如模块、函数、枚举变体、关联函数、常量等 std::io::stdinVec::newOption::Some
. 用于访问实例的字段或方法 instance.fieldinstance.method()

综合示例

以下代码展示了 ::. 的综合用法:

rust 复制代码
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

通过这些示例可以清楚地看到 ::. 的区别:

  • :: 是静态路径,用于访问命名空间内的内容。
  • . 是动态访问,用于实例的字段或方法。
相关推荐
跟着珅聪学java1 小时前
spring boot +Elment UI 上传文件教程
java·spring boot·后端·ui·elementui·vue
我命由我123451 小时前
Spring Boot 自定义日志打印(日志级别、logback-spring.xml 文件、自定义日志打印解读)
java·开发语言·jvm·spring boot·spring·java-ee·logback
徐小黑ACG2 小时前
GO语言 使用protobuf
开发语言·后端·golang·protobuf
0白露3 小时前
Apifox Helper 与 Swagger3 区别
开发语言
Tanecious.4 小时前
机器视觉--python基础语法
开发语言·python
叠叠乐4 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
战族狼魂5 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
niandb5 小时前
The Rust Programming Language 学习 (九)
windows·rust
Tttian6226 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
杉之6 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue