由结构体持有的特质对象中的显式生命周期声明

9
在回答这个问题时,讨论了如何引用由结构体持有的特质对象,需要使用以下语法:
struct Bar<'a> {
    foo: &'a (Foo + 'a),
}

根据RFC 438,这是每个

RFC 438


我可以请求更多有关双重生命周期声明的解释吗?Levans说:
“您必须为引用的生命周期和特征对象本身的寿命指定两次:因为特征可以用于引用,如果基础对象是引用,则必须指定其生命周期。”
我了解结构中引用的生命周期概念。但我不明白为什么生命周期不是针对特征所在的对象。换句话说,我不知道如何持有一个特征的引用,而不持有对其作为特征来源的底层实体的引用。
是否存在特征和底层对象具有不同生命周期的情况? 持有特征的引用而没有持有底层特征的东西意味着什么?
再问一下,为什么Rust不能使用以下正确的方式:
struct Bar<'a> {
    foo: &'a Foo,
}

请问如何将"The Right Thing(tm)"解释为与上面的声明等价?

抱歉一下子问了这么多问题,但我感觉自己在做一些非常基础的事情(使用trait作为通用特性),却不得不深入挖掘,我想了解为什么会这么深。

错误信息:error: explicit lifetime bound required并没有提供明显的帮助,因为已经有了生命周期绑定。

1个回答

10
由于对trait对象的引用和trait对象本身可能具有不同的生命周期,因此生命周期不适用于trait所在的对象。以下是一个为引用实现的trait示例:
trait Quack {
    fn quack(&self) { println!("Quack") }
}

impl<'a> Quack for &'a bool {}

struct MasterQuack<'a> {
    q: &'a (Quack + 'a),
}

fn main() {
    let a = true;
    // a.quack(); // Nope, not defined
    (&a).quack();

    // MasterQuack {q: &a}; // Nope, this would be a reference to a boolean, which isn't Quack
    MasterQuack {q: &&a};
}

需要翻译的内容:

需要注意的是,&'a (Trait + 'b) 是完全可以的——也就是说,一个引用一个 trait,本身有/是一个引用,并且这些生命周期是不同的。你在以下内容中已经这样表达了:

是否存在一种情况,其中 trait 和基础对象具有不同的生存期?

但更多的情况是“基础对象具有具有不同生存期的引用”。

为什么 Rust 不能做正确的事情(™)

根据RFC 599,现在编译如下:

struct Bar<'a> {
    foo: &'a Foo,
}

1
相关:https://github.com/rust-lang/rfcs/blob/master/text/0141-lifetime-elision.md#lifetime-elision-in-structs - Steve Klabnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接