使用需要所有权的方法时发生移动

Move occurs when using a method that requires ownership

我正在使用 Reqwest 调用一些 API。我想要一个通用函数来解析如下响应:

async fn response_to_result(response: &Response) -> anyhow::Result<()> {
    let status = response.status().as_u16();
    let response_message = response.text().await?; // Move here because of response.text() 
    return if status == 200 {
        Ok(())
    } else {
        Err(anyhow::anyhow!(response_message))
    };
}

这是我得到的错误:

move occurs because `*response` has type `reqwest::Response`, which does not implement the `Copy` trait

通过调用 response.text()(方法定义:pub async fn text(self) -> crate::Result<String>)进行移动。通常使用参数我们可以通过引用传递,但是对于方法我不知道。有人对此有解决方案吗?

Normally with params, we can pass with reference

只要该方法不消耗该值,就是如此。 text() 确实如此,因为它 assemble 为您将所有块放在一起。这是它的签名:

pub async fn text(self) -> Result<String>

注意 self 而不是 &self。 运行text()后,整个流被消费,构造一个String,返回给你管理。 Response 没有存储所有这些数据的内部缓冲区。一旦流被消耗,它就消失了;跟踪它是调用者的工作。以后对 text()(或 bytes())的调用无法正常工作。所以text()破坏了整个Response。调用text().

后无法继续使用

因此您需要传递实际值,而不是借用它。删除 Response 上的 &

如果你想要一个(可变的)借用版本,你需要 assemble 自己使用 chunk() 块。但你可能不想这样做。您可能只想传递 Response(不带 &)并让 response_to_result() 消耗像 text().

这样的值