likes
comments
collection
share

Rust:调用函数操作符 . 和 :: 的区别

作者站长头像
站长
· 阅读数 21

.操作符

在Rust中,.::操作符都可以用来调用方法,但它们的用法有所不同。

.操作符用于调用实例方法。实例方法是定义在类型上的方法,它需要一个类型的实例作为第一个参数(通常称为self)。而实例方法(instance methods)与其他语言中的动态方法(dynamic methods)类似。都需要先声明一个实例后,才可以用的方法。例如,下面是一个简单的结构体和一个实例方法的示例:

struct Point {
    x: i32,
    y: i32,
}

impl Point {
    fn distance_from_origin(&self) -> f64 {
        let x = self.x as f64;
        let y = self.y as f64;
        (x * x + y * y).sqrt()
    }
}

fn main() {
    let p = Point { x: 3, y: 4 };
    let d = p.distance_from_origin();
    println!("Distance from origin: {}", d);
}

上面的代码定义了一个名为Point的结构体,它有两个字段xy。然后,我们在impl Point块中定义了一个名为distance_from_origin的实例方法。这个方法接受一个名为self的参数,它表示调用该方法的实例。在这个方法中,我们使用了self.xself.y来访问实例的字段。

main函数中,我们创建了一个名为pPoint实例,并使用.操作符来调用它的实例方法。也就是说,我们使用了语句p.distance_from_origin()来调用该方法。

::操作符

::操作符则用于调用关联函数。关联函数也是定义在类型上的函数,但它不需要一个类型的实例作为第一个参数。Rust中的关联函数(associated functions)与其他语言中的静态方法(static methods)类似。例如,下面是一个简单的结构体和一个关联函数的示例:

struct Point {
    x: i32,
    y: i32,
}

impl Point {
    fn new(x: i32, y: i32) -> Self {
        Self { x, y }
    }
}

fn main() {
    let p = Point::new(3, 4);
}

上面的代码定义了一个名为Point的结构体,它有两个字段xy。然后,我们在impl Point块中定义了一个名为new的关联函数。这个函数接受两个参数:x和y,并返回一个新创建的Point实例。

在main函数中,我们使用::操作符来调用Point类型上的关联函数。也就是说,我们使用了语句Point::new(3, 4)来调用该函数。

如何选择使用实例方法,还是关联函数?

实例方法通常用于操作类型的实例。例如,您可以定义一个Point结构体,它有两个字段xy,然后定义一个实例方法来计算点到原点的距离。这个方法需要一个Point类型的实例作为第一个参数,然后使用这个实例的字段来进行计算。

关联函数通常用于执行与类型相关但不依赖于类型实例的操作。例如,您可以定义一个关联函数来创建一个新的Point实例。这个函数不需要一个Point类型的实例作为第一个参数,而是接受一些参数来初始化新创建的实例。

在选择使用实例方法还是关联函数时,您应该考虑您要执行的操作是否依赖于类型的实例。如果是,则应该使用实例方法;否则,应该使用关联函数。from刘金,转载请注明原文链接。感谢!