我对::
和.
之间的区别感到困惑。它们看起来很相似,除了语法不同。
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
在上述情况下,我访问了String
中的new()
函数。那么String::new()
和String.new()
之间有什么区别?.
只用于方法吗?
我对::
和.
之间的区别感到困惑。它们看起来很相似,除了语法不同。
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
在上述情况下,我访问了String
中的new()
函数。那么String::new()
和String.new()
之间有什么区别?.
只用于方法吗?
.
用于左侧有值的情况,::
用于类型或模块的情况。
或者说:.
用于访问值成员,::
用于访问命名空间成员。
::
和.
之间有一个有用的区别,这个区别在方法语法(Method Syntax)中有所展示。struct
中的一个fn
实例时,使用点号.
: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()
);
}
另一方面,相关函数是不以self
作为参数的函数。它们没有struct
的实例:
impl Rectangle {
// Associated Function
fn square(size: u32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}
}
::
用于调用这些函数。
fn main() {
let sq = Rectangle::square(3);
}
相比之下,.
用于返回一个方法(结构体实例的函数)。
我喜欢这样思考,如果方法将&self
作为参数,我们使用.
语法;如果不需要&self
作为参数,我们使用::
语法。
例如,引用@Dan的回答来计算面积时,我们需要一个对象,它的length
和height
。所以我们将&self
作为参数传递,并使用.
语法。创建一个新的正方形时,我们不需要现有对象,因此使用::
语法。
x.do()
表示在对象x
上执行函数do()
,而x::do()
表示从x
的命名空间中执行函数do()
。
严格来说,.
用于结构体的方法,::
用于结构体关联函数。
::
的情况。它还用于访问模块成员。被接受的答案解释得很好。 - Chayim Friedman
String::new()
只是在访问该命名空间的成员。在io::stdin().read_line(&mut guess)
的情况下,stdin()
是io
的一个成员,但返回的值不是任何namespace
的一部分,它只是一个实例(文档中说pub struct Stdin
)?所以这是一个结构体?就像一个对象? - Dan::
访问它。io 是一个命名空间,您可以通过::
访问其中的内部 "things"(结构体、特性等)。 - hellowString::new()
调用的是由String
类型定义的函数。这与调用任何其他函数没有区别。io::stdin()
返回一个值,因此.read_line
查找并调用由Stdin
类型定义的方法read_line
。唯一不同的是,在.
左侧的东西(Stdin
)作为self
参数传递给了read_line
。而“对象”是如此地多重载,以至于我无法真正回答。这取决于您对“对象”的理解。 - DK.pub fn stdin() -> Stdin
,文档说明构造了一个新句柄
,其中Stdin
是Struct std::io::Stdin
。它们似乎不被称为类型或模块。 - Danstdin
的情况下,它没有指定结果是类型还是模块,因为它必须是一个类型,因为你不能返回一个模块。模块纯粹是用来组织事物的。 - DK.