在this question的答案中,讨论了如何引用结构所包含的特征对象,这需要以下语法:
struct Bar<'a> {
foo: &'a (Foo + 'a),
}
这是RFC 438
我可以要求更多解释双倍寿命声明吗? Levans说:
您必须指定两次生命周期:一次为生命周期 引用,一次是特征对象本身,因为特征 可以实现引用,如果底层对象是a 参考,你必须指定它的寿命。
我理解结构中引用的生命周期概念。但是我不明白为什么生命不适合特征是特征的对象。换句话说,我不知道如何保留特征的引用意味着它没有引用它是特征的基础事物。
是否存在特征和基础对象具有不同生命期的情况?保持对特征的引用而不保持特征所依据的基础事物意味着什么?
问另一种方式,为什么Rust不能做正确的事情(tm):
struct Bar<'a> {
foo: &'a Foo,
}
哪里正确的事(tm)会将其解释为与上述声明等同?
很抱歉有问题轰炸,但我觉得我做了一些非常基本的事情(使用特性作为一个普通的方面),我不得不深入兔子洞,我想知道为什么兔子洞很深。
错误消息:error: explicit lifetime bound required
显然无益,因为已经存在生命限制。
答案 0 :(得分:6)
为什么生命不适用于特征是
特征的对象
因为对特征对象和特征对象本身的引用可能具有不同的生命周期。以下是为参考实施的特征示例:
trait Quack {
fn quack(&self) { println!("Quack") }
}
impl<'a> Quack for &'a bool {}
struct MasterQuack<'a> {
q: &'a (Quack + 'a),
}
fn main() {
let a = true;
// a.quack(); // Nope, not defined
(&a).quack();
// MasterQuack {q: &a}; // Nope, this would be a reference to a boolean, which isn't Quack
MasterQuack {q: &&a};
}
有一点需要注意的是,拥有&'a (Trait + 'b)
是完全没问题的 - 也就是说,对自身具有/是参考的特征的引用,这些生命期是不同的。你跟
是否存在特征和基础对象的生命周期不同的情况?
但更多的是“底层对象具有不同生命周期的引用”。
为什么Rust不能做正确的事(tm)
截至RFC 599,现在编译:
struct Bar<'a> {
foo: &'a Foo,
}