【问题标题】:Matching String: cannot move out of borrowed content匹配字符串:不能移出借来的内容
【发布时间】:2015-04-28 18:03:01
【问题描述】:

req.url.fragment 是可选的String。如果它有一个值,我想将该值复制到fragment,否则我想分配一个空字符串。我不断收到我cannot move out of borrowed content 的错误。

我该如何解决这个问题?

fn fb_token(req: &mut Request) -> IronResult<Response> {
    let fragment = match req.url.fragment {
        Some(fragment) => fragment,
        None => "".to_string(),
    };

    Ok(Response::with((status::Ok, fragment)))
}

【问题讨论】:

    标签: rust


    【解决方案1】:

    这取决于你想对结构中的现有字符串做什么。

    let fragment = match req.url.fragment {
        Some(fragment) => fragment,
        None => "".to_string(),
    };
    

    在这段代码中,您将移动字符串从req.url.fragment 中移出,但这会使它处于未定义状态。这是一件坏事,Rust 会阻止你这样做!

    如错误消息所述:

    为防止移动,请使用ref fragmentref mut fragment 通过引用捕获值

    如果你想将字符串留在原处并返回一个副本,那么你可以获取一个引用然后克隆它:

    let fragment = match req.url {
        Some(ref fragment) => fragment.clone(),
        None => "".to_string()
    };
    

    如果要将现有字符串保留为None,则可以使用take

    let fragment = match req.url.take() {
        Some(fragment) => fragment,
        None => "".to_string()
    };
    

    更短的,你可以使用unwrap_or_else

    let fragment = req.url.take().unwrap_or_else(String::new);
    

    【讨论】:

    • 我确实了解借用如何冻结引用的对象,这意味着在这种情况下不允许移动,但我只是不知道如何避免移动。显然,我需要修改一些概念并更仔细地阅读文档。感谢您的帮助:)
    【解决方案2】:

    这里的问题是不能使&amp;mut 引用无效,而将所有权移出是使引用无效的一种方法。 (右侧边栏中有一些类似问题/答案的链接。)

    解决方法是改用引用,在这种情况下应该可以很好地工作:

    fn fb_token(req: &mut Request) -> IronResult<Response> {
        let fragment: &str = match req.url.fragment {
            Some(ref fragment) => &**fragment,
            None => "",
        };
    
        Ok(Response::with((status::Ok, fragment)))
    }
    

    &amp;str 注释不是必需的,只是为了让发生的事情更清楚。)

    这是因为iron implements Modifier&lt;Response&gt; for &amp;str,所以该类型可以与with 一起使用,而不是拥有的String

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-02
      • 2013-10-18
      • 1970-01-01
      • 2016-09-15
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多