匹配字符串:不能移出借用的内容

Matching String: cannot move out of borrowed content

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

这取决于您要对结构中的现有字符串执行的操作。

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

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

如错误消息所述:

to prevent the move, use ref fragment or ref mut fragment to capture value by reference

如果您想将字符串保留在原处并 return 一个副本,那么您可以引用然后克隆它:

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

这里的问题是无法使 &mut 引用无效,移出所有权是一种无效方法。 (右侧边栏中有一些类似 questions/answers 的链接。)

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

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