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