当我们让特征继承“静态”时,这意味着什么?
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!() }
}
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!() }
}