Rust 的临时变量那令人恐惧且出人意料地深邃的兔子洞

主要观点:

  • 深入探讨 Rust 中“临时值”(temporaries)的概念,包括其定义、创建条件、生命周期等。
  • 通过多个示例解释了在不同场景下临时值的行为,如在let语句、引用操作等中的表现。
  • 提及了常量提升(constant promotion)和生命周期扩展(lifetime extension)对临时值的影响。

关键信息:

  • 临时值是在特定上下文(如值表达式在位置表达式上下文中)创建的无名内存位置,其值被放置其中,通常在封闭语句结束时被丢弃。
  • 位置表达式表示内存位置,值表达式表示实际值,let语句的右侧等是位置表达式上下文。
  • 常量提升条件:表达式可在编译时求值、无析构函数、无内部可变性。
  • 生命周期扩展是临时值的特殊情况,有时会将临时值的生命周期扩展到包含let语句的块的范围,基于模式和表达式有不同的扩展情况。

重要细节:

  • 示例代码如struct Foo; impl Drop for Foo { fn drop(&mut self) {} } fn main() { let x = Some(&Foo); x; }中,由于Foo未实现Drop且无内部可变性,可被提升为'static&Foo返回对静态值的引用。
  • let x = &Foo; x;中,&Foo是扩展表达式,Foo的临时内存位置生命周期被扩展到main块。
  • 而在let x = Some(&Foo); x;中,Some(&Foo)是扩展表达式,但&Foo不是,无生命周期扩展,Foo的临时值在let语句结束时丢弃。
  • 对于模式扩展,如let ref x = Foo(Bar).0;ref x是扩展模式,Foo(Bar).0的生命周期被扩展。
阅读 15
0 条评论