我已经学习了两种在Rust中调用方法的方法.

第一种方法称为static methods,它不需要实例,可以直接使用 struct 调用.

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

而这两种方法的区别在于第一个参数是否为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
    }
}

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

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"));
}

我不明白with_ymd_and_hmsTimeZone中的定义如下:

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

它应该是一个instance method.但是为什么它可以被称为Local.with_ymd_and_hms呢?

如果有人能帮上忙,我将不胜感激.

推荐答案

让我们来看看chrono::offset::Localdefinition:

struct Local;

如你所见,Localunit-like struct, 它没有 struct 体.

Ruust允许您不仅将这些 struct 的名称用作type,而且 也隐含着value的意思.

Local.with_ymd_and_hms调用实例方法with_ymd_and_hms 在类型Localvalue上,这是这里隐式构造的这个零大小类型的实例.

您可以改写Local{}.with_ymd_and_hms,它具有相同的语义.但作为特例,Rust允许省略类单元 struct 的构造函数大括号.

Rust相关问答推荐

重新导出proc宏导致未解决的extern crate错误""

从特征实现调用函数的Rust惯用方法

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

新创建的变量的绑定生存期

为什么铁 rust S似乎有内在的易变性?

如何点击()迭代器?

正则表达式中的重叠匹配?(铁 rust 正则式发动机)

我如何使用AWS SDK for Rust获取我承担的角色的凭据?

如何在嵌套的泛型 struct 中调用泛型方法?

如何使用reqwest进行异步请求?

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

tokio::sync::broadcast::Receiver 不是克隆

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

产生拥有值的迭代器的 Rust 可变borrow 在循环中失败

如何获取包裹在 Arc<> 和 RwLock<> 中的 Rust HashMap<> 的长度?

当 `T` 没有实现 `Debug` 时替代 `unwrap()`

隐式类型闭包的错误生命周期推断

有没有更好的方法来为拥有 DIsplay 事物集合的 struct 实现 Display?

使用泛型作为关联类型,没有幻像数据

为什么这里需要类型注解?