编者注:此代码在之后不再产生相同的错误RFC 599 https://github.com/rust-lang/rfcs/blob/master/text/0599-default-object-bound.md已实施,但答案中讨论的概念仍然有效。
我正在尝试编译这段代码:
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>,
I want S.a
拥有一个实例A
,并且不知道这个生命周期在这里是如何合适的。我需要做什么才能让编译器满意?
我的铁锈版本:
rustc --version
rustc 0.12.0-pre-nightly (79a5448f4 2014-09-13 20:36:02 +0000)
(有点迂腐的观点: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
the S
对象将被困在某个堆栈帧内)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)