来自此代码模板,该模板可以:
{
fn f3( _s : &String) {}
fn f( s : &String) -> impl FnMut() {
let s2 = s.clone();
move || f3( &s2)
}
let mut f2 = f( &"123".to_string());
f2();
}
如果我这样修改代码:
{
fn f3( _s : &[u8]) {}
fn f( s : &[u8]) -> impl FnMut() {
// let s2 = s.clone(); // don't work
let s2 = Vec::from(s);
move || f3( &s2[..])
}
let mut f2 = f( &vec![1u8][..]);
f2();
}
我不能使用'让s2 = s.克隆();'。这将显示错误消息:
1169 | fn f( s : &[u8]) -> impl FnMut() {
| ------------ this return type evaluates to the `'static` lifetime...
1170 | let s2 = s.clone();
| ^^^^^ ...but this borrow...
|
note: ...can't outlive the anonymous lifetime #1 defined on the function body at 1169:3
克隆如何启动借用?
1条答案
按热度按时间0yg35tkg1#
在第一个示例中,
s
是&String
,而String
实现Clone
,因此使用了clone(&self)
方法。在第二个示例中,
s
是一个&[u8]
,而[u8]
没有实现Clone
,因此您使用的是&T
的一揽子实现,其中T
是任何类型;也就是说,你是在克隆引用,而不是被引用的东西。2结果是对同一个东西的另一个引用,因此它仍然是一个借用。这种情况下的解决方案是使用不同于
.clone()
的方法来创建切片的自有副本,正如您所注意到的,Vec::from
可以工作,并为您提供Vec<u8>
;你也可以使用Box::from
来得到一个Box<[u8]>
。你不能(目前)把一个原始的[u8]
作为一个局部变量,因为它是一个无大小的类型,所以这里使用::from
是因为你需要选择你所拥有的副本是什么类型。