如何初始化Weak<dyn T + Send + Sync>为空?Rust开发问题
如何初始化空的
Weak<dyn EventObserver + Send + Sync>? 我正在实现如下发布/订阅模型:
trait EventObserver { ... } struct Publisher { observer: Mutex<Weak<dyn EventObserver + Send + Sync>>, }
尝试用以下代码初始化Publisher时:
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:
impl Publisher { pub fn new() -> Publisher { Publisher { observer: Mutex::new(Weak::<dyn EventObserver + Send + Sync>::new()), } } }
编译器依然报错:
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.upgrade()在初始时返回None,调用subscribe()后能成功升级。目前我知道两种替代方案:用Option包裹Weak,或者创建一个实现EventObserver的空结构体。有没有更简洁的方式直接初始化空的Weak<dyn EventObserver + Send + Sync>?
解决方案:类型强制转换构造空Weak
可以通过将空的Weak<()>强制转换为目标类型来实现,这是最简洁的方式,不需要额外包装或空结构体:
use std::sync::{Mutex, Weak}; trait EventObserver {} struct Publisher { observer: Mutex<Weak<dyn EventObserver + Send + Sync>>, } impl Publisher { pub fn new() -> Publisher { Publisher { // 先创建空的Weak<()>,再强制转换为目标dyn trait类型 observer: Mutex::new(Weak::<()>::new() as Weak<dyn EventObserver + Send + Sync>), } } }
原理说明
空的Weak指针本质上不指向任何堆内存,因此其内部的具体类型信息不影响upgrade()的行为——无论原类型是什么,空Weak调用upgrade()都会返回None。通过这种强制转换,我们绕过了Weak::new()对Sized类型的要求,同时让编译器明确了目标类型,完美满足初始化需求。
内容的提问来源于stack exchange,提问作者OLNG
相关产品推荐
相关产品推荐

