You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:22:42