匹配字符串:不能移出借用的内容
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
。
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
orref 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
。