Rust 通用生命周期省略问题

问题描述 投票:0回答:1

我正在尝试实现通用的可观察集合,以便与我正在编写的 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 类型系统造成了烦恼???

generics rust events types lifetime
1个回答
0
投票

在这种情况下你不能忽略生命周期,因为没有任何地方可以推断出生命周期。只需将命名的生命周期参数添加到定义类型即可:

struct ObservableList<'a, T> {
    items: Vec<T>,
    on_changed: Event<OnChangedArgs<'a, T>>,
}
© www.soinside.com 2019 - 2024. All rights reserved.