我在努力理解生命的意义.我知道(我认为)用输入参数(即foo<‘a>(x:&’a字符串)->&‘a字符串{})指定生存期意味着返回值继承输入参数的生存期,因此将一直存在.然而,下面的代码在没有任何输入参数的情况下编译得很好,所以我不明白编译器是如何知道我希望Dragon::Green的引用存在足够长的时间以离开作用域的.所有权是否正在向更高的范围转移,或者正在发生其他事情?

fn main() {
  let d;

  {
    let dtile = testtile();
    d = dtile;
  }
  
  println!("{:?}", d);
}

#[derive(PartialOrd, Ord, PartialEq, Eq, Debug)]
enum Dragon {
    White,
    Green,
    Red
}

fn testtile<'a>() -> &'a Dragon {
    &Dragon::Green
}

推荐答案

使用输入参数(即foo<;‘a&>;(x:&;’a字符串)-&>‘a字符串{})指定生存期意味着返回值继承输入参数的生存期

不完全是.生命周期说明符是descriptive,而不是prescriptive.

他们帮助borrow checker人在一生中执行规则.

每个引用都有一个生命周期.但有时您需要通过名称引用该生命周期,这就是生命周期说明符的用武之地.

在您的示例中,borrow 判断器发现由testtile返回的引用必须与变量d一样长.然后,它try 找到concrete生存期来替换使其工作的通用生存期参数'a.

在这种情况下,这确实奏效了.例如,如果我们指定引用有'static个生存期,就不会有问题.考虑到简单的枚举变量实际上只是一个常量,这里没有问题.

在更复杂的情况下,可能没有有效的方法来找到生命周期来替代生命周期参数,尽管这会更常见,例如,如果Dragon struct 本身引用contained.

Rust相关问答推荐

如何使用Match比较 struct 中的值

Rust:跨多个线程使用hashmap Arc和rwlock

两个相关特征的冲突实现错误

`Pin`有没有不涉及不安全代码的目的?

将Vec<;U8&>转换为Vec<;{Float}&>

Rust面向对象设计模式

确保参数是编译时定义的字符串文字

是否可以在不直接重复的情况下为许多特定类型实现一个函数?

仅发布工作区的二进制 crate

我可以禁用发布模式的开发依赖功能吗?

如何基于常量在Rust中跳过一个测试

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

在 Rust 中,Weak 如何知道内部值何时被删除?

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

为什么分配对变量的引用使我无法返回它

覆盖类型的要求到底是什么?为什么单个元素元组满足它?

在使用大型表达式时(8k 行需要一小时编译),是否可以避免 Rust 中的二次编译时间?

相互调用的递归异步函数:检测到循环

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?

为什么可以从不可变 struct 的字段中移动?