我正在学习Rust,并认为我会尝试制作一个非常简单的反应式流库。代码示例如下:
trait Observable<T> {
// some stuff for emitting values when requested
}
trait Mappable<T, U> {
fn map(self, f: fn(&T) -> U) -> Box<dyn Observable<U>>;
}
struct Just<T> {
value: T
}
impl<T> Observable<T> for Just<T> {}
impl<T, U: 'static> Mappable<T, U> for Just<T> {
fn map(self, f: fn(&T) -> U) -> Box<dyn Observable<U>> {
Box::new(Just { value: f(&self.value) })
}
}
为了使其工作,我需要在'static
的{{1}}实现中为U
类型赋予Mappable
生存期。没有它,编译器会抱怨:
Just
我不明白为什么编译器会抱怨这一点,因为该值放在error[E0310]: the parameter type `U` may not live long enough
--> src/lib.rs:17:9
|
15 | impl<T, U> Mappable<T, U> for Just<T> {
| - help: consider adding an explicit lifetime bound `U: 'static`...
16 | fn map(self, f: fn(&T) -> U) -> Box<dyn Observable<U>> {
17 | / Box::new(Just {
18 | | value: f(&self.value),
19 | | })
| |__________^
|
note: ...so that the type `Just<U>` will meet its required lifetime bounds
--> src/lib.rs:17:9
|
17 | / Box::new(Just {
18 | | value: f(&self.value),
19 | | })
| |__________^
内。
提供Box
的生命周期显然是可行的,但我担心它会造成内存泄漏,因为流中的中间阶段要等到程序退出后才能释放。
我认为解决方案是使'static
的生存期与U
相同。但是我所做的所有尝试都失败了。
如何在不使用T
的情况下表达以上代码?