匹配字符串:无法移出借来的内容

时间:2015-04-28 18:03:02

标签: rust

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)))
}

2 个答案:

答案 0 :(得分:11)

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

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);

答案 1 :(得分:2)

这里的问题是,一个人无法使&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)))
}

&str注释不是必需的,只是为了更清楚地了解正在发生的事情。)

这可以使用iron implements Modifier<Response> for &str,因此该类型可以与with一起使用,而不是拥有String