rust 方法存在,但不满足以下trait界限(泛型)

wa7juj8i  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(177)

我有一个工作函数foo,它编译时没有错误:

use chrono;

fn foo() {
    let now = chrono::offset::Local::now();
    let mut buf = String::new();
    buf.push_str(&now.format("%Y/%m/%d").to_string());
}

当我尝试将now变量提取到一个参数时:

fn foo<T: chrono::TimeZone>(now: chrono::DateTime<T>) {
    let mut buf = String::new();
    buf.push_str(&now.format("%Y/%m/%d").to_string());
}

我在编译时遇到了这个错误:

error[E0599]: no method named `format` found for struct `chrono::DateTime<T>` in the current scope
   --> src/lib.rs:108:35
    |
108 |                 buf.push_str(&now.format("%Y/%m/%d").to_string());
    |                                   ^^^^^^ method not found in `chrono::DateTime<T>`
    |
    = note: the method `format` exists but the following trait bounds were not satisfied:
            `<T as chrono::TimeZone>::Offset: std::fmt::Display`

注解指出format存在(它确实存在,就像在第一个代码片段中一样),但是trait bounds不满足。我如何指定缺少的trait bounds来编译它?
考虑到第一个代码段编译成功,并且我只提取了相同的类型作为参数,我猜这应该是可能的。
相关chrono文档:https://docs.rs/chrono/0.4.19/chrono/struct.DateTime.html

8ehkhllq

8ehkhllq1#

我看了一下DateTime的impl块,它有如下形式的代码。我更新了函数的签名以匹配,现在它成功编译了。

fn foo<T: chrono::TimeZone>(now: chrono::DateTime<T>)
where
    T::Offset: std::fmt::Display, {
    ...
}

相关问题