Rust 匿名切片生存期
考虑以下代码:Rust 匿名切片生存期,rust,Rust,考虑以下代码: fn fun() { let mut vec = vec![]; { let x: &[u8] = &[1, 2]; vec.push(x); // why is the compiler happy? let y = [3, 4]; let z: &[u8] = &y; vec.push(z); // ok compiler is not happy
fn fun() {
let mut vec = vec![];
{
let x: &[u8] = &[1, 2];
vec.push(x); // why is the compiler happy?
let y = [3, 4];
let z: &[u8] = &y;
vec.push(z); // ok compiler is not happy
}
println!("{:?}", vec); // after commenting this line the compiler is happy again
}
我理解为什么编译器抱怨借来的值对于y来说寿命不够长,但是为什么它对x感到满意呢?x是对一个没有名字的切片的引用-这个匿名切片什么时候被删除,它的生存期是什么
在注释了println everything compiles之后,我想这是因为编译器知道vec没有在任何地方使用,所以它不在乎。在x的情况下,编译器认为&[1,2]借用了一个可以写在常量中的表达式,所以它对&'static[u8;2]:
当表达式可以在常量中写入、借用并取消引用最初写入表达式的位置,而不更改运行时行为时,会将值表达式提升到“静态”插槽。也就是说,可以在编译时对提升的表达式求值,结果值不包含内部可变或析构函数。这些属性在可能的情况下根据值确定,例如&None始终具有type&'static选项,因为它不包含任何不允许的内容
z的表达式是&y,不能写在常数中,因为它借用了变量y,所以这不适用于z。对于x,编译器认为&[1,2]借用了一个可以写在常数中的表达式,所以它借用了&'static[u8;2]:
当表达式可以在常量中写入、借用并取消引用最初写入表达式的位置,而不更改运行时行为时,会将值表达式提升到“静态”插槽。也就是说,可以在编译时对提升的表达式求值,结果值不包含内部可变或析构函数。这些属性在可能的情况下根据值确定,例如&None始终具有type&'static选项,因为它不包含任何不允许的内容
z的表达式,即&y,不能写在常数中,因为它借用了变量y,因此不适用于z。预期的向量类型是什么?我相信编译器认为它是vec的预期类型是什么?我相信编译器认为它是Vec