Reputation: 2705
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?
Upvotes: 35
Views: 6643
Reputation: 436
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, its length
and its height
. 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()
means execute the function do()
on the object x
and x::do()
means execute the function do()
from the namespace of x
.
In rigorous words, .
is used for methods of a struct and ::
is used for associative functions of a struct.
Upvotes: -1
Reputation: 2705
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).
Upvotes: 24
Reputation: 59065
.
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.
Upvotes: 45