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

Explicit lifetime declarations in trait objects held by structs

在对 this question 的回答中讨论了如何引用结构持有的特征对象,这需要以下语法:

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

这是根据 RFC 438

我可以要求更多关于双生命周期声明的解释吗?莱文斯说:

You have to specify the lifetime two times : once for the lifetime of the reference, and once for the trait object itself, because traits can be implemented for references, and if the underlying object is a reference, you must specify its lifetime as well.

我理解结构中引用的生命周期概念。但是我不明白为什么生命周期不是针对特征是特征的对象。换句话说,我不知道在没有引用作为特征的基础事物的情况下持有特征的引用是什么意思。

是否存在特征和底层对象具有不同生命周期的情况?保留对特征的引用而不保留该特征所依据的基础事物意味着什么?

换一种方式问,为什么 Rust 不能做正确的事情(tm):

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

正确的做法 (tm) 会将其解释为等同于上述声明?

很抱歉问了很多问题,但我觉得我在做一些非常基础的事情(使用特征作为通用方面),我不得不深入探索,我想了解一下为什么兔子洞那么深

错误消息:error: explicit lifetime bound required 显然没有帮助,因为已经存在生命周期限制。

why the lifetime isn't for the object that the trait is a trait on

因为对特征对象的引用和特征对象本身可能有不同的生命周期。这是为参考而实现的特征示例:

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) 是完全没问题的 - 也就是说,对本身具有 / 的特征的引用是一个引用,并且这些生命周期是不同的。你说的和

一样多

Is there a case where the trait and the underlying object would have different lifetimes?

但更像是 "the underlying object has references with different lifetimes"。

why can't Rust just do The Right Thing(tm)

RFC 599 开始编译:

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