【发布时间】:2015-07-09 03:36:48
【问题描述】:
这是一个无效的 Rust 程序(Rust 1.1 版),其函数执行 HTTP 客户端请求并仅返回标头,丢弃响应中的所有其他字段。
extern crate hyper;
fn just_the_headers() -> Result<hyper::header::Headers, hyper::error::Error> {
let c = hyper::client::Client::new();
let result = c.get("http://www.example.com").send();
match result {
Err(e) => Err(e),
Ok(response) => Ok(response.headers),
}
}
fn main() {
println!("{:?}", just_the_headers());
}
以下是编译器错误:
main.rs:8:28: 8:44 error: cannot move out of type `hyper::client::response::Response`, which defines the `Drop` trait
main.rs:8 Ok(response) => Ok(response.headers),
^~~~~~~~~~~~~~~~
error: aborting due to previous error
我理解为什么借用检查器不接受这个程序——即,drop 函数将在其 headers 成员移动后使用 response。 p>
我的问题是:我怎样才能解决这个问题并且仍然拥有良好的安全 Rust 代码?我知道我可以通过clone() 进行复制,如下所示:
Ok(response) => Ok(response.headers.clone()),
但是,来自 C++,这似乎效率低下。当 move 就足够时,为什么要 copy 呢?我设想在 C++ 中执行以下操作来强制调用移动构造函数(如果可用):
headers_to_return = std::move(response.headers);
有没有什么办法可以放弃 Rust 中的 copy 而是强制 move,类似于 C++?
【问题讨论】:
-
这在技术上不会移动成员值,但是如果您可以稍微更改结构,但是您可以通过将
response.headers的类型更改为Option<Headers>来包装标题和take()它的价值。这会将值重置为 None,如果您无法为您的类型找到合适的默认值(例如thread),这将很有用。这是在 doc.rust-lang.org/stable/book/ch17-03-oo-design-patterns.html 和 doc.rust-lang.org/stable/book/… 中完成的
标签: rust