我学习了两种在 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?
如果有人能提供帮助,我将不胜感激。
让我们看看的定义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 允许省略类似单元结构的构造函数大括号。