简体   繁体   中英

What is the difference between :: and . in Rust?

I am confused by the difference between :: and . . They look the same except that their syntax are different.

 let mut guess = String::new(); io::stdin().read_line(&mut guess).expect("Failed to read line");

"Programming a Guessing Game" from The Rust Programming Language

In the above case, I access the function new() in String . What is the difference between String::new() and String.new() ? Is . only for methods?

. is used when you have a value on the left-hand-side. :: is used when you have a type or module.

Or: . is for value member access, :: is for namespace member access.

A useful distinction I found useful between :: and . is shown in Method Syntax .

When calling an instance of a fn in a struct , . is used:

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!(
        "The area of the rectangle is {} square pixels.",
        rect1.area()
    );
}

Associated functions on the other hand, are functions that do not take self as a param. They do not have an instance of the struct :

impl Rectangle {
    // Associated Function
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

:: is used instead to call these functions.

fn main() {
    let sq = Rectangle::square(3);
}

Whereas . is used to return a method (a function of an instance of a struct).

I like to think if the method takes &self as a parameter, we use . syntax and if it does not, then we use :: syntax.

For example, to quote @Dan's answer, to calculate the area, we need an object, it's length and it's height and so we pass &self as a parameter and we use . syntax. To create a new square, we don't need an existing object and we use :: syntax.

x.do() just means execute the function do() on the object x and x::do() means execute the function do() from the namespace of x .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM