我正在尝试实现通用的可观察集合,以便与我正在编写的 UI 框架一起使用。我目前遇到的问题是泛型中的生命周期不可消除。
为简洁起见,以下
Callback
和 Event
类型不是完整的事件框架,但仍应突出显示该问题。
type Callback<Args> = Arc<dyn Fn(&Args)>;
struct Event<Args> {
handlers: Vec<Callback<Args>>,
}
struct OnChangedArgs<'a, T> {
items: std::slice::Iter<'a, T>,
}
struct ObservableList<T> {
items: Vec<T>,
on_changed: Event<OnChangedArgs<'_, T>>,
// ^^^^^ can't elid lifetime
}
我可以通过以非通用方式编写事件系统来解决我的问题,但这可能会导致代码重复非常烦人。
struct OnChangedArgs<'a, T> {
items: std::slice::Iter<'a, T>,
}
pub type OnChangedCallback<T> = Arc<dyn Fn(&OnChangedArgs<T>)>;
// ^^^^^ lifetime elided
struct OnChangedEvent<T> {
handlers: Vec<OnChangedCallback<T>>,
}
struct ObservableList<T> {
items: Vec<T>,
on_changed: OnChangedEvent<T>,
}
我是愚蠢还是这似乎对 Rust 类型系统造成了烦恼???
在这种情况下你不能忽略生命周期,因为没有任何地方可以推断出生命周期。只需将命名的生命周期参数添加到定义类型即可:
struct ObservableList<'a, T> {
items: Vec<T>,
on_changed: Event<OnChangedArgs<'a, T>>,
}