rust - 此 rust 功能与生命周期之间有什么区别

标签 rust lifetime

Rust一生的概念对我来说很困惑。我有以下两个功能:

fn test1<'a, 'b: 'a>(x: &'a u32, y: &'b u32) -> &'a u32 {
    if x > y {
        x
    } else {
        y
    }
}

fn test2<'a, 'b: 'a>(x: &'b u32, y: &'a u32) -> &'a u32 {
    if x > y {
        x
    } else {
        y
    }
}

fn main() {
    let a = 5;

    {
        let b = 6;
        let c = test1(&a, &b);
        println!("{}", c);
    }

    {
        let b = 6;
        let c = test2(&a, &b);
        println!("{}", c);
    }
}

该程序可以编译,结果是
6
6

但是,我无法弄清 test1 test2 之间的区别
有人可以解释吗?

最佳答案

TLDR:没有实际区别。

您必须了解的是,Rust生命周期指示不是严格的相等声明,而是表示“比”更长的关系。所以当你写:

fn foo<'a> (x: &'a i32)

您正在告诉编译器:“为了调用foo,必须存在一些生存期的'a,并且x的生存期至少应与'a一样长(但是x的生存期可能会更长)。”

回到您的函数定义:
fn test1<'a, 'b: 'a>(x: &'a u32, y: &'b u32) -> &'a u32

这表示:
  • 必须存在一些终生'a,以便x的生命周期至少与'a一样长(但生命周期可能更长)。
  • 必须存在一些生命周期的'b,该生命周期至少与'a一样长(但可以相同),以便y的生命周期至少与'b一样长(但生命周期更长)。
  • 并且返回值的生存期不能超过'a

  • 由于对'b没有其他约束,因此编译器始终可以自由选择'b = 'a,并且只要满足'a的约束,代码就可以编译。

    当您调用该函数时,编译器将搜索与上述约束匹配的一些生存期'a'b:
    let a = 5;
    {
        let b = 6;
        let c = test1(&a, &b);
        println!("{}", c);
    }
    
  • 返回值的生存期不能超过'a,因此'a必须在函数调用处开始(因为返回值之前不存在),并最早在结束括号处结束。
  • 此处xa,且x的生存时间至少应与'a一样长。由于a是在函数调用之前定义的,并且在结束括号处仍然有效,所以一切都很好。
  • 此处yb,且y的生存时间至少应与'b一样长。如果我们选择'b = 'a,那么一切都很好,因为b是在函数调用之前定义的,并且一直存在到右括号为止。

  • 因此,编译器选择'a == 'b从函数调用开始,到结束括号为止。变量ab的生存期都比这更长,但这很好,因为参数的生存期注释是相应变量的真实生存期的下限。

    注意:相同的推理适用于您的第二个函数,并且只要满足所有其他约束,编译器就可以始终选择'b = 'a

    关于rust - 此 rust 功能与生命周期之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60964731/

    相关文章:

    module - 为什么我不能从同一目录中的不同文件导入模块?

    linux - 是否可以在没有管理员权限的情况下在 Linux 上安装 Rust?

    c++ - 我可以在调用 glDrawArrays 后删除 OpenGL 顶点数组吗?

    rust - 引用“静态生命周期不长?

    rust - 如何使用可变成员 Vec?

    rust - 如何使用 `RefCell<Vec<Weak<Gadget>>>` 字段类型实现调试结构?

    C++函数什么时候删除返回值?

    c++ - 在自己的初始化器中使用变量

    高阶函数中的 Rust 生命周期

    rust - 为什么我需要导入特征才能使用它为类型定义的方法?