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

Rust 匹配字符串:无法移出借用的内容,rust,Rust,req.url.fragment是可选的String。如果它有一个值,我想将该值复制到片段,否则我想分配一个空字符串。我不断收到一个错误,即我无法移出借用的内容 我如何解决这个问题 fn fb_token(req: &mut Request) -> IronResult<Response> { let fragment = match req.url.fragment { Some(fragment) => fragment,

req.url.fragment
是可选的
String
。如果它有一个值,我想将该值复制到
片段
,否则我想分配一个空字符串。我不断收到一个错误,即我
无法移出借用的内容

我如何解决这个问题

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)))
}
fn fb_令牌(请求:&mut请求)->IronResult{
让fragment=match req.url.fragment{
一些(片段)=>片段,
无=>“”。到字符串(),
};
Ok(响应::with((状态::Ok,片段)))
}

这取决于您想对结构中的现有字符串执行什么操作

let fragment = match req.url.fragment {
    Some(fragment) => fragment,
    None => "".to_string(),
};
在这段代码中,您将字符串移出
req.url.fragment
,但这将使其处于未定义状态。这是件坏事,生锈会阻止你这么做

如错误消息所述:

要防止移动,请使用
ref fragment
ref 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\u或\u else

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

这里的问题是不能使
&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)))
}
fn fb_令牌(请求:&mut请求)->IronResult{
让片段:&str=match req.url.fragment{
一些(参考片段)=>&**片段,
无=>“”,
};
Ok(响应::with((状态::Ok,片段)))
}
(没有必要使用
&str
注释,只是为了更清楚地说明发生了什么。)


这是因为,该类型可以与
with
一起使用,而不是使用拥有的
字符串

我确实了解借用如何冻结引用的对象,这意味着在这种情况下不允许移动,但我无法想出如何避免移动。显然,我需要修改一些概念,更仔细地阅读文档。谢谢你的帮助:)