使用需要所有权的方法时发生移动
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()
.
这样的值
我正在使用 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()
.