0
lazy_static::lazy_static! {
    static ref file_data: String = fs::read_to_string("static/login.html").expect("unable to read from static/login.html");
}

#[tokio::main]
async fn main() {
    // code omitted
    let login = warp::path("login").map(move || warp::reply::html(file_data));
    // code omitted
}

编译错误:

error[E0277]: the trait bound `hyper::body::body::Body: std::convert::From<file_data>` is not satisfied
   --> src/main.rs:45:49
    |
45  |     let login = warp::path("login").map(move || warp::reply::html(file_data));
    |                                                 ^^^^^^^^^^^^^^^^^ the trait `std::convert::From<file_data>` is not implemented for `hyper::body::body::Body`
    | 
   ::: /home/ichi/.cargo/registry/src/github.com-1ecc6299db9ec823/warp-0.2.3/src/reply.rs:170:11
    |
170 |     Body: From<T>,
    |           ------- required by this bound in `warp::reply::html`
    |
    = help: the following implementations were found:
              <hyper::body::body::Body as std::convert::From<&'static [u8]>>
              <hyper::body::body::Body as std::convert::From<&'static str>>
              <hyper::body::body::Body as std::convert::From<bytes::bytes::Bytes>>
              <hyper::body::body::Body as std::convert::From<std::borrow::Cow<'static, [u8]>>>
            and 4 others

我正在尝试将 a 传递String给闭包。根据文档From<String>实现hyper::body::Bodyfile_data属于类型String。那么为什么我会收到这个错误?

4

2 回答 2

2

这里的问题是lazy_static创建了一个引用您的数据的包装器类型,并且hyper不知道如何处理它。您可以使用file_data.clone()克隆引用的数据并从中构造一个主体,但在这种情况下,实际上有一个更简单的方法。由于您的字符串具有固定值并Body实现From<&'static str>,因此您实际上不需要堆分配String或根本不需要lazy_static:您可以使用以下代码,它只使用可以直接使用的常量字符串切片。

const FILE_DATA: &str = "test";

#[tokio::main]
async fn main() {
    // code omitted
    let login = warp::path("login").map(move || warp::reply::html(FILE_DATA));
    // code omitted
}
于 2020-07-11T17:50:10.117 回答
2

lazy_static

对于给定static ref NAME: TYPE = EXPR;的,宏生成一个唯一类型,该类型实现Deref<TYPE>并将其存储在带有名称的静态中NAME。(属性最终会附加到这种类型。)

也就是说,变量的类型不是 TYPE

这就是您看到错误的原因

the trait `std::convert::From<file_data>` is not implemented for `hyper::body::body::Body`
                              ^^^^^^^^^

您可能会更幸运地明确取消引用或克隆全局变量:warp::reply::html(&*file_data)warp::reply::html(file_data.clone()).

于 2020-07-11T17:50:20.470 回答