如何通过 Weak::new() 创建 Weak<dyn T>?

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

我正在开发一个如下所示的发布/订阅模型:

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>
初始化为空?

rust observer-pattern weak-references
1个回答
2
投票

Weak::new()
没有
?Sized
界限,所以这不能自然地完成。解决方法是创建一个实现该特征的类型的
Weak
。如果您没有可访问的此类类型,则可以创建这样的类型,该类型只会在所有方法中发生恐慌(因为它们永远不会被调用)。

例如:

impl Publisher {
    pub fn new() -> Publisher {
        let publisher = Publisher {
            observer: Mutex::new(Weak::<SomeTypeImplementingEventObserver>::new()),
        };
        publisher
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.