为什么“明确的约束一生所需”的盒子 指导? 为什么“明确的约束一生所需”的盒子 指导?(W

2019-05-11 23:06发布

编者注:此代码不再生产后,同样的错误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)

Answer 1:

这里的问题是,一个特征可以参考实现,所以,如果你不指定任何盒的所需的寿命可以存储在那里。

你可以看到在这个寿命要求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 ),但你需要一辈子参数中所有使用的类型。



Answer 2:

(略迂腐一点: 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小于'staticS对象将被捕获一些堆叠内帧)。



文章来源: Why “explicit lifetime bound required” for Box in struct?