首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将一个字段从实现Drop特征的结构中移出?

如何将一个字段从实现Drop特征的结构中移出?
EN

Stack Overflow用户
提问于 2015-07-09 11:36:48
回答 1查看 8.5K关注 0票数 28

下面是一个无效的Rust程序(Rust version 1.1),其中包含一个函数,该函数执行HTTP客户端请求并仅返回报头,从而删除响应中的所有其他字段。

代码语言:javascript
复制
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());
}

以下是编译器错误:

代码语言:javascript
复制
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函数在移动了它的response成员之后将使用headers

我的问题是:我如何才能绕过这个问题,同时仍然拥有良好的安全Rust代码?我知道我可以通过clone()复制一份,就像这样:

代码语言:javascript
复制
Ok(response) => Ok(response.headers.clone()),

但是,从C++的角度来看,这似乎是低效的。当移动应该足够时,为什么要复制呢?我设想在C++中执行类似以下的操作来强制调用移动构造函数(如果可用):

代码语言:javascript
复制
headers_to_return = std::move(response.headers);

有没有办法放弃Rust中的副本,而是强制移动,类似于C++?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31307680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档