【问题标题】:Why can I use the same lifetime label for variables that have different lifetimes?为什么我可以为具有不同生命周期的变量使用相同的生命周期标签?
【发布时间】:2016-04-13 20:09:59
【问题描述】:

为什么这段代码会编译?

#[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);
    }
}

在我的Foo 结构中,我的x 字段包含&amp;strs 的切片。我对这些生命周期标签的理解是切片和个体&amp;strs 具有相同的生命周期。

但是,在我的示例中,&amp;strt(在外部块中)与容器切片(在内部块中)的生命周期不同。

【问题讨论】:

    标签: rust


    【解决方案1】:

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

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

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

    RFC #738 — Variance 提供了一些更详细的信息。

    【讨论】:

    • 感谢您的回答和链接!这很有帮助
    【解决方案2】:

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

    • 标记循环
    • 表示绑定

    第一种情况,标注循环:

    fn main() {
        'a: loop {
            println!("{}", 3);
            break 'a;
        }
    }
    

    这里,'a 清楚地描述了循环体的生命周期,并允许一举打破多层循环。

    第二种也是更相似的情况,是使用'a 来表示一个绑定

    fn<'a> susbtr(haystack: &'a str, offset: usize) -> &'a str;
    

    在这种情况下,生命周期'a 并不代表变量的实际生命周期,它代表了被引用变量生命周期的绑定,并允许捆绑在一起 各种变量的界限。

    请注意,调用者和被调用者对绑定的解释不同:

    • 从调用者的角度来看,'a 是一个上限,承诺返回值将至少与参数一样长(也许更长,不保证)
    • 从被调用者(即substr)的角度来看,'a 是一个下界,检查任何返回值必须存在至少一样长 em> 作为参数(可能更长,没必要)

    我们可以有差异,因为边界不代表实际的生命周期,当一个边界用于多个生命周期时,编译器将简单地推断出对这种情况有意义的最低/最高边界:

    • 调用者获得最低上限可行(即,最少保证)
    • 调用者获得最高的下界可行(即,最小的约束)

    例如:

    fn<'b> either(one: &'b str, two: &'b str, flag: bool) -> &'b str {
        if flag { one } else { two }
    }
    

    可以通过以下方式调用:

    fn<'a> call(o: &'a str, flag: bool) -> &'a str {
        either(o, "Hello, World", flag)
    }
    

    这里,o 的生命周期是未知的(有些是 'a),而 "Hello, World" 的生命周期是已知的('static),'static 的定义是生命周期中较大的一个(它为所有人而活)程序)。

    • call 的调用者只知道返回值至少与o 一样长
    • call 必须保证这一点,它将o"Hello, World" 提供给either,其中'b 被推断为'a'static 之间的最低界限(因此'a
    • either 必须返回与它的任何一个参数一样长的东西;它不知道他们的寿命可能会有所不同,并且不在乎

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 2018-12-15
      相关资源
      最近更新 更多