Vector 为什么borrow checker会抱怨这些不同切片的寿命?

Vector 为什么borrow checker会抱怨这些不同切片的寿命?,vector,rust,slice,lifetime,borrow-checker,Vector,Rust,Slice,Lifetime,Borrow Checker,在下面的代码中,为什么使用数组切片有效,而使用Vec的切片无效 使用rand:{rngs::adapter::ReadRng,RngCore}; 使用std::io::Read; 结构MyRng{ rng:盒子, } pub fn main(){ //版本1:错误 // 让data=Vec:::new(); 让data_slice=data.as_slice(); //第二版:作品 // //让数据_切片=&[0_u8][…]; //版本3:错误(!?!) // //设数据=[0_u8]; //

在下面的代码中,为什么使用数组切片有效,而使用
Vec的切片无效

使用rand:{rngs::adapter::ReadRng,RngCore};
使用std::io::Read;
结构MyRng{
rng:盒子,
}
pub fn main(){
//版本1:错误
//
让data=Vec:::new();
让data_slice=data.as_slice();
//第二版:作品
//
//让数据_切片=&[0_u8][…];
//版本3:错误(!?!)
//
//设数据=[0_u8];
//让数据_切片=&数据[…];
让read=Box::new(数据片)作为Box;
设rng=Box::new(ReadRng::new(read));
//有了这个注释,所有版本都可以工作。
MyRng{rng};
}
有几件事让我困惑:

  • 如果三种方法都在同一范围内,那么它们之间的区别是什么
  • 错误表明,
    数据
    在借用时被删除,但指向作用域的末尾-到那时不是所有内容都被删除了吗
  • 为什么如果我删除
    MyRng
    实例化,一切都会正常工作

如果特征没有生存期界限,则生存期在表达式中推断,并且在表达式之外是静态的

因此,默认情况下,装箱的trait对象会得到一个静态绑定。所以这个结构:

struct MyRng{
rng:盒子,
}
实际上扩展到:

struct MyRng{
rng:盒子{

rng:Box
[0_u8]
是一个常数,因此它会经历,允许对它的引用有一个静态生存期,因此它不会被删除。您的代码失败,因为您有一个切片借用了局部变量
数据
,但试图从中创建一个
MyRng
变量