我有一个基于上下文类型参数化的Widget
特质:
trait Widget<C> {
fn f<'a>(&self, ctx: &'a mut C);
}
一些小部件具有相同的上下文类型,但包含引用因此被参数化:
struct Ctxt<'c> {
data: &'c u32,
}
struct W1 {}
struct W2 {}
impl<'c> Widget<Ctxt<'c>> for W1 { // and W2
fn f<'a>(&self, ctx: &'a mut Ctxt<'c>) {
unimplemented!()
}
}
我有一个多部件需要存储多个这样的内容:
struct WV {
widgets: Vec<Box<Widget<Ctxt<????>>>>,
}
impl<'c> Widget<Ctxt<'c>> for WV {
fn f<'a>(&self, ctx: &'a mut Ctxt<'c>) {
for w in &self.widgets {
w.f(ctx);
}
}
}
看起来我需要一个Vec<Box<Widget<for<'c> Ctxt<'c>>>>
,但你不能这样做!或者只在f
的定义中指定生命周期:
impl Widget<Ctxt> for W {
fn f<'a, 'c>(&self, ctx: &'a mut Ctxt<'c>) {
unimplemented!()
}
}
这个也不行(Ctxt
缺少生命周期参数)。
上下文的目的是传递一个可变引用到只在f
期间需要的长期存在的东西;&mut
引用不能存储在W1
等中。我不想为Ctxt
指定任何生命周期。
如何存储多个特质实现者,允许传递包含引用的上下文?
struct WV<'c> { widgets: Vec<Box<Widget<Ctxt<'c>>>> }
?所有的生命周期都必须在静态时已知,并且这将统一它们。 - Shepmasterf
并传入上下文之前,生命周期是未知的。目前(没有使用WV
),我只存储一个没有生命周期参数的W1
,当调用w1.f()
时,特质实际上是为那一刻的Ctxt<'c>
专门化的。下次调用w1.f()
可能是在Widget<Ctxt<'d>>
上;但是w1
是相同的。创建不会发生在方法调用的同一作用域中。 - Chris Emerson