我正在开发一个如下所示的发布/订阅模型:
trait EventObserver { ... }
struct Publisher {
observer: Mutex<Weak<dyn EventObserver + Send + Sync>>,
}
如何将
Publisher
设置为空来初始化 Weak
?
如果我这样写:
impl Publisher {
pub fn new() -> Publisher {
Publisher {
observer: Mutex::new(Weak::new()),
}
}
}
编译器说:
error[E0283]: type annotations needed
--> src/lib.rs:12:34
|
12 | observer: Mutex::new(Weak::new()),
| ^^^^^^^^^ cannot infer type of the type parameter `T` declared on the struct `Weak`
|
= note: cannot satisfy `_: Unsize<dyn EventObserver + Send + Sync>`
= note: required for the cast from `std::sync::Weak<_>` to `std::sync::Weak<(dyn EventObserver + Send + Sync + 'static)>`
help: consider specifying the generic argument
|
12 | observer: Mutex::new(Weak::<T>::new()),
| +++++
如果我指定类型为
dyn EventObserver + Send + Sync
,编译器会说:
error[E0599]: the function or associated item `new` exists for struct `Weak<dyn EventObserver + Send + Sync>`, but its trait bounds were not satisfied
--> src/lib.rs:12:75
|
3 | trait EventObserver {}
| ------------------- doesn't satisfy `dyn EventObserver + Send + Sync: Sized`
...
12 | observer: Mutex::new(Weak::<dyn EventObserver + Send + Sync>::new()),
| ^^^ function or associated item cannot be called on `Weak<dyn EventObserver + Send + Sync>` due to unsatisfied trait bounds
|
= note: the following trait bounds were not satisfied:
`dyn EventObserver + Send + Sync: Sized`
我只是在寻找一种将
Weak
初始化为空的方法,因此预计 observer
的任何升级都将无法找到有效的指针。调用subscribe()
后,Weak
后续升级即可成功。
我确实知道两种解决方法,一种是使用
Option
来包装 Weak,另一种是创建一个实现该特征的结构。与这些解决方法相比,是否有一种干净的方法可以将 Weak<dyn T + Send + Sync>
初始化为空?
Weak::new()
没有 ?Sized
界限,所以这不能自然地完成。解决方法是创建一个实现该特征的类型的 Weak
。如果您没有可访问的此类类型,则可以创建这样的类型,该类型只会在所有方法中发生恐慌(因为它们永远不会被调用)。
例如:
impl Publisher {
pub fn new() -> Publisher {
let publisher = Publisher {
observer: Mutex::new(Weak::<SomeTypeImplementingEventObserver>::new()),
};
publisher
}
}