Rust 为什么我可以对具有不同生存期的变量使用相同的生存期标签?

Rust 为什么我可以对具有不同生存期的变量使用相同的生存期标签?,rust,Rust,这段代码为什么要编译 #[derive(Debug)] pub struct Foo<'a> { pub x: &'a [&'a str], } fn main() { let s = "s".to_string(); let t: &str = s.as_ref(); { let v = vec![t]; let foo = Foo { x: &v[..] }; pri

这段代码为什么要编译

#[derive(Debug)]
pub struct Foo<'a> {
    pub x: &'a [&'a str],
}

fn main() {
    let s = "s".to_string();
    let t: &str = s.as_ref();
    {
        let v = vec![t];
        let foo = Foo { x: &v[..] };
        println!("{:?}", &foo);
    }
}
#[派生(调试)]
pub struct Foo
我对这些生命周期标签的理解是,切片和单个
&strs
具有相同的生命周期

这是一种常见的误解。这确实意味着必须有一个适用于两者的生命周期。实例化时,
Foo
struct的
'a
对应于
let v=vec!之后的内部块的行![t] )因为这是两个变量共享的生命周期

如果这种灵活性不存在,那么使用寿命将非常痛苦。在两行上定义的变量具有不同的实际寿命(第一行定义的变量比第二行定义的变量寿命长)。如果生命周期必须真正匹配,我们就必须在同一行定义所有变量

有关更多详细信息,请参阅

我对这些生命周期标签的理解是,切片和单个
&strs
具有相同的生命周期

这是一种常见的误解。这确实意味着必须有一个适用于两者的生命周期。实例化时,
Foo
struct的
'a
对应于
let v=vec!之后的内部块的行![t] )因为这是两个变量共享的生命周期

如果这种灵活性不存在,那么使用寿命将非常痛苦。在两行上定义的变量具有不同的实际寿命(第一行定义的变量比第二行定义的变量寿命长)。如果生命周期必须真正匹配,我们就必须在同一行定义所有变量


有关更多详细信息,请参见。

语法
'a
实际上用于两种不同的情况:

  • 标记循环
  • 表示界限的
第一种情况,标记循环:

fn main() {
    'a: loop {
        println!("{}", 3);
        break 'a;
    }
}
在这里,
'a
清楚地描绘了线圈体的寿命,并允许一次性从多层线圈中断开

第二种情况,也是更相似的情况,是使用
'a
表示边界:

可通过以下方式调用:

fn<'a> call(o: &'a str, flag: bool) -> &'a str {
    either(o, "Hello, World", flag)
}
fn&a str{
或者(o,“你好,世界”,国旗)
}
这里,
o
的生存期未知(一些
'a
),而
“Hello,World”
的生存期已知(
'static
),
'static
的定义是生存期中的较大者(它适用于所有程序)

  • 调用
    call
    的调用方只知道返回值的寿命至少与
    o
  • 调用
    必须保证这一点,它将
    o
    “你好,世界”
    提供给
    其中
    'b
    被推断为
    'a
    'static
    之间的最低界限(因此
    'a
  • 要么
    只需返回与其中一个参数寿命相同的内容;它不知道他们的一生可能不同,也不在乎

    • 语法
      'a
      实际上用于两种不同的情况:

      • 标记循环
      • 表示界限的
      第一种情况,标记循环:

      fn main() {
          'a: loop {
              println!("{}", 3);
              break 'a;
          }
      }
      
      在这里,
      'a
      清楚地描绘了线圈体的寿命,并允许一次性从多层线圈中断开

      第二种情况,也是更相似的情况,是使用
      'a
      表示边界:

      可通过以下方式调用:

      fn<'a> call(o: &'a str, flag: bool) -> &'a str {
          either(o, "Hello, World", flag)
      }
      
      fn&a str{
      或者(o,“你好,世界”,国旗)
      }
      
      这里,
      o
      的生存期未知(一些
      'a
      ),而
      “Hello,World”
      的生存期已知(
      'static
      ),
      'static
      的定义是生存期中的较大者(它适用于所有程序)

      • 调用
        call
        的调用方只知道返回值的寿命至少与
        o
      • 调用
        必须保证这一点,它将
        o
        “你好,世界”
        提供给
        其中
        'b
        被推断为
        'a
        'static
        之间的最低界限(因此
        'a
      • 要么
        只需返回与其中一个参数寿命相同的内容;它不知道他们的一生可能不同,也不在乎

      感谢您的回答和链接!这非常有用谢谢你的回答和链接!那很有帮助