在Rust中,当我们希望一个 struct 包含引用时,我们通常会这样定义它们的生存期:

struct Foo<'a> {
    x: &'a i32,
    y: &'a i32,
}

但也可以为同一 struct 中的不同引用定义多个生存期:

struct Foo<'a, 'b> {
    x: &'a i32,
    y: &'b i32,
}

什么时候这样做有用?有人能提供一些示例代码,当两个生命周期都为'a时不编译,但当两个生命周期都为'a'b时编译(或反之亦然)?

推荐答案

熬夜太晚之后,我想出了一个例子,说明生命周期很重要.以下是代码:

static ZERO: i32 = 0;

struct Foo<'a, 'b> {
    x: &'a i32,
    y: &'b i32,
}

fn get_x_or_zero_ref<'a, 'b>(x: &'a i32, y: &'b i32) -> &'a i32 {
    if *x > *y {
        return x
    } else {
        return &ZERO
    }
}

fn main() {
    let x = 1;
    let v;
    {
        let y = 2;
        let f = Foo { x: &x, y: &y };
        v = get_x_or_zero_ref(&f.x, &f.y);
    }
    println!("{}", *v);
}

如果将Foo的定义更改为:

struct Foo<'a> {
    x: &'a i32,
    y: &'a i32,
}

那么代码就无法编译.

基本上,如果你想在任何函数上使用 struct 的字段,要求它的参数有不同的生命周期,那么 struct 的字段也必须有不同的生命周期.

Rust相关问答推荐

如何在Rust中获得高效的浮点最大值

从Rust调用C++虚拟方法即使在成功执行之后也会引发Access违规错误

将内部类型作为参数的泛型 struct 上的方法

如何为utoipa中的可选查询参数生成OpenAPI模式?

带扫描的铁 rust 使用滤镜

函数内模块的父作用域的访问类型

在文件链实施中绕过borrow 判断器

不能在Rust中使用OpenGL绘制三角形

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

为什么将易错函数的泛型结果作为泛型参数传递 infer ()?不应该是暧昧的吗?

如何强制匹配的返回类型为()?

详尽的匹配模式绑定

Rust 并行获取对 ndarray 的每个元素的可变引用

sha256 摘要仅适用于 &*

从 Axum IntoResponse 获取请求标头

LinkedList::drain_filter::drop 中 DropGuard 的作用是什么?

如何在 Rust 中编写修改 struct 的函数

如何获取包裹在 Arc<> 和 RwLock<> 中的 Rust HashMap<> 的长度?

返回 &str 但不是 String 时,borrow 时间比预期长

当值是新类型包装器时,对键的奇怪 HashMap 生命周期要求