rust :切片克隆方法有什么不同?

9rygscc1  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(172)

来自此代码模板,该模板可以:

{ 
  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

克隆如何启动借用?

0yg35tkg

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是因为你需要选择你所拥有的副本是什么类型。

相关问题