为什么 Rust 中实例方法可以像静态方法一样被调用?

Sab*_*ber 4 rust

我学习了两种在 Rust 中调用方法的方法。

第一种方式称为静态方法,它不需要实例,可以直接使用结构体调用。

第二种方式称为实例方法,它需要一个对象实例来调用它。

两种方法的区别在于第一个参数是否为self

例子:

struct User {
    name: String,
}


impl User {
    //static method
    fn new(name: String) -> Self {
        User { name }
    }
    //instance method
    fn get_name(&self) -> String {
        self.name
    }
}
Run Code Online (Sandbox Code Playgroud)

但我发现可以这样调用一些方法:

use chrono::Local;
use chrono::TimeZone;
fn main() {
    let time = Local.with_ymd_and_hms(2024, 1, 26, 15, 0, 0).unwrap();
    println!("{}", time.format("%F %T"));
}
Run Code Online (Sandbox Code Playgroud)

我不明白。with_ymd_and_hms定义TimeZone如下:

    fn with_ymd_and_hms(
        &self,
        year: i32,
        month: u32,
        day: u32,
        hour: u32,
        min: u32,
        sec: u32,
    ) -> LocalResult<DateTime<Self>> {
Run Code Online (Sandbox Code Playgroud)

它应该是一个实例方法。但为什么可以这样称呼呢Local.with_ymd_and_hms

如果有人能提供帮助,我将不胜感激。

Chr*_*isB 9

让我们看看的定义chrono::offset::Local

struct Local;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Local是一个类似单元的 struct,它没有结构体。

Rust 允许您不仅将这些结构体的名称用作类型还可以隐式地用作

Local.with_ymd_and_hms对type 的with_ymd_and_hms 调用实例方法,该值是此处隐式构造的零大小类型的实例。Local

您可以改为编写Local{}.with_ymd_and_hms,它具有相同的语义。但作为一种特殊情况,Rust 允许省略类似单元结构的构造函数大括号。