编者注:此代码不再生产后,同样的错误RFC 599中实现,但是在回答讨论的概念仍然是有效的。
我试图编译这段代码:
trait A {
fn f(&self);
}
struct S {
a: Box<A>,
}
而我得到这个错误:
a.rs:6:13: 6:14 error: explicit lifetime bound required
a.rs:6 a: Box<A>,
我想Sa
自己的实例A
,并没有看到这一辈子是如何适用于本案。 我需要做什么做的,使编译器高兴吗?
我的防锈版本:
rustc --version
rustc 0.12.0-pre-nightly (79a5448f4 2014-09-13 20:36:02 +0000)
这里的问题是,一个特征可以参考实现,所以,如果你不指定任何盒的所需的寿命可以存储在那里。
你可以看到在这个寿命要求RFC 。
所以,一个可能的解决方案是绑定一辈子那么Send
(我们把我在S):
trait A {
fn f(&self);
}
struct I;
impl A for I {
fn f(&self) {
println!("A for I")
}
}
struct S {
a: Box<A + Send>
}
fn main() {
let s = S {
a: box I
};
s.a.f();
}
另一种是寿命设置为'a
(我们可以把与I或I至S的引用):
trait A {
fn f(&self);
}
struct I;
impl A for I {
fn f(&self) {
println!("A for I")
}
}
impl <'a> A for &'a I {
fn f(&self) {
println!("A for &I")
}
}
struct S<'a> {
a: Box<A + 'a>
}
fn main() {
let s = S {
a: box &I
};
s.a.f();
}
请注意,这是更普遍的,我们可以同时存储引用和所拥有的数据( Send
那种有一辈子的'static
),但你需要一辈子参数中所有使用的类型。
(略迂腐一点: A
是一个性状,所以S
不拥有的一个实例A
,它拥有某种类型的实现的一个包装实例A
)。
的性状对象表示有一些未知类型的数据,也就是知道关于数据的唯一的事情是,它实现了性状A
。 因为类型是未知的,编译器不能直接推论所包含的数据的寿命,所以要求此信息在性状对象类型明确说明。
这是通过做Trait+'lifetime
。 最简单的途径是只使用'static
,也就是完全禁止存储的数据可能由于使用范围无效:
a: Box<A + 'static>
此前,(寿命有界性状对象的可能性而在此之前explicit lifetime bound required
被引入的错误消息)所有盒装性状对象是隐式'static
,即,该受限的形式是唯一的选择。
最灵活的形式向外暴露寿命:
struct S<'x> {
a: Box<A + 'x>
}
这允许S
来存储实现任何类型的性状对象A
,可能具有在其中的所述范围的一些限制S
是有效的(即,对于类型为其中'x
小于'static
的S
对象将被捕获一些堆叠内帧)。