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
一起使用,而不是使用拥有的字符串
我确实了解借用如何冻结引用的对象,这意味着在这种情况下不允许移动,但我无法想出如何避免移动。显然,我需要修改一些概念,更仔细地阅读文档。谢谢你的帮助:)