请考虑下面的例子

struct Foo {
    val: &str
}

fn main() {
    let hello = String::from("hello");
    let foo = Foo{ val: &hello[..]};

}

这不能编译,因为需要一个生命周期.一个非常简单的解决方法如下:

struct Foo<'a> {
    val: &'a str
}

为什么编译器不能假设(作为合理的默认设置)引用将与 struct Foo一样长?有没有不会出现这种情况的用例?

推荐答案

因为假设引用将与struct Foo一样长,那将是明显错误的.例如,考虑一下这个问题.


fn main() {
    let foo: Foo;
    {
        let string = "foo".to_string();
        foo = Foo {
            val: string.as_str(),
        }
    }

    println!("{}", foo.val);


}

如果编译器假设这里的"合理缺省值"是string将与Foo一样长,这将被编译.但我们可以清楚地看到,在内循环结束后,string会被删除,但foo即使在它之后也会存活.

简而言之,它的Foo岁S的生命周期 取决于&str岁,而不是反过来,即Foo岁不可能比&str岁.

Rust相关问答推荐

给定使用newype习语定义的类型上的铁 rust Vec,有没有方法获得底层原始类型的一部分?

为什么拥有的trait对象的相等运算符移动了正确的操作数?

铁 rust 干线无法使用PowerShell获取环境变量

如何提高自定义迭代器的`extend`性能

使用铁 rust S还原对多个数组执行顺序kronecker积

是否可以使用Rust宏来构建元组的项?

铁 rust 中双倍或更多换行符的更好练习?

Rust ndarray:如何从索引中 Select 数组的行

什么是`&;[][..]`铁 rust 里的刻薄?

在 Rust 中用问号传播错误时对类型转换的困惑?

为相同特征的特征对象使用 move 方法实现特征

在 Rust 中,是否可以定义一个需要实现类型的构造函数的对象安全特征?

可以在旋转循环中调用try_recv()吗?

注释闭包参数强调使用高阶排定特征界限

在 Bevy 项目中为 TextureAtlas 精灵实施 NearestNeighbor 的正确方法是什么?

用逗号分隔字符串,但在标记中使用逗号

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用

Cargo:如何将整个目录或文件包含在功能标志中?

将数据序列化为 struct 模型,其中两个字段的数据是根据 struct 中的其他字段计算的

基于名称是否存在的条件编译