当我们让特征继承“静态”时,这意味着什么?

What does it mean when we let a trait inherits 'static?

Rust支持trait继承,如下:

pub trait A {}
pub trait B: A {}

B: A表示如果某个类型T实现了B,它还需要实现A.

中的所有方法

但是今天我看到了下面的代码:

trait Display: 'static {
    fn print(&self);
}

这是什么意思?好像不是trait遗传。

Rust 没有继承。

它有一种定义约束的方法。例如,一个特征可能被限制为只能由实现另一个特征的类型实现。

在你的例子中,约束是 lifetime bound

要实现您的 Display 特征,对象可以包含引用,但在这种情况下,它们的生命周期必须遵守此约束。

假设您属于这种类型:

struct S<'a> {
    s: &'a str,
}

那么你无法在任何生命周期内实施该特征,只能'static

impl Display for S<'static> {
    fn print(&self){}
}

fn main() {
    let s1 = "test";
    let a = S { s: s1 };
    a.print(); // compiles

    let s2 = "test".to_string();
    let a = S { s: &s2 };
    a.print(); // doesn't compile because s doesn't live long enough
}

Rust supports trait inheritance, as follows [...] B: A means that if some type T implements B, it also needs to implement all the methods in A.

从技术上讲,这不是继承,而是要求。它 trait bound 与您在函数中拥有的不完全不同:它将实现 B 的类型able 限制为仅已实现 A 的类型.

随着措辞的改变,第二个版本更容易理解:它是一个 lifetime bound,这意味着它将 B 可实现的类型限制为仅具有 'static 生命周期,这意味着如果你试图在一个类型上实现 B,那么它要么根本没有生命周期,要么有一个 'static 生命周期(或者实现必须有一个生命周期限制,也就是只适用于一些 类型的使用)。

您可以看到,如果您尝试在生命周期通用结构上实现特征:

struct A<'a>(&'a str);
trait Display: 'static {
    fn print(&self);
}

impl <'a>Display for A<'a> {
    fn print(&self) { todo!() }
}

会产生

error[E0478]: lifetime bound not satisfied

那是因为'a可以是任何东西,所以为A<'a>实现Display意味着它也为非'static实例实现,这是无效的。

通过在 impl 上添加相关的生命周期限制 ,从而将实现限制为 A<'static> 个实例:

struct A<'a>(&'a str);
trait Display: 'static {
    fn print(&self);
}

impl <'a: 'static>Display for A<'a> {
    fn print(&self) { todo!() }
}

特征的要求得到满足,实现有效(注意:这里不需要'a你可以impl ... for A<'static>,我展示它是为了规律性)。

如果你的结构没有生命周期它默认工作,因为没有生命周期~'static:

struct A(String);
trait Display: 'static {
    fn print(&self);
}

impl Display for A {
    fn print(&self) { todo!() }
}