Objective

我正在为 struct Publisher开发订阅者/发布者模式.所以观察者是

trait EventObserver {
     fn update_info(&self, info: Information) -> Result<(), Error>;
}

现在,出版商有一个受std::sync::Mutex保护的字段

struct Publisher {
    observer: Mutex<Weak<dyn EventObserver + Send + Sync>>,
}

问题是,如何使用弱到零来初始化发布程序?稍后,我将使用另一个函数"订阅"来设置观察者.请注意,弱类型具有Send和Sync,因为此发布服务器的调用方还需要获取期货.因此,如果没有这些,编译器将会抱怨类型不是发送和同步.

Problems

如果我以不同的方式编写,则会出现不同的编译器错误

impl Publisher {
    pub fn new() -> Publisher {
        let publisher = Publisher {
            observer: Mutex::new(Weak::new()),
        };
        publisher
    }
}

错误是"无法推断在 struct Weak上声明的类型参数T的类型"

但类型是Dyn EventWatch+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 publisher::EventObserver + std::marker::Send + std::marker::Sync: std::marker::Sized`

Question

我只是在寻找一种方法来初始化弱者为零,所以预计observer的任何升级都会找不到有效的指针.在调用subscribe之后,那么弱者的后期升级才能成功.

我知道两个解决办法,一个是使用选项来包装弱者,另一个是创建一个实现特征的 struct .与这些解决方法相比,有没有一种干净的方法可以将这个&lt;dyn T+Send+Sync&>的弱点初始化为空?

推荐答案

Weak::new()没有?Sized的界限,所以这不可能是自然而然的.修复方法是创建实现特征的类型的Weak.如果您没有这样的类型可访问,您可以创建在所有方法中都会死机的类型(因为它们无论如何都不会被调用).

例如:

impl Publisher {
    pub fn new() -> Publisher {
        let publisher = Publisher {
            observer: Mutex::new(Weak::<SomeTypeImplementingEventObserver>::new()),
        };
        publisher
    }
}

Rust相关问答推荐

关联类型(类型参数)命名约定

如何导出 rust 色二进制文件中的符号

展开枚举变量并返回所属值或引用

Rust类似功能是C++命名空间吗?

如何为 struct 字段设置新值并在Ruust中的可变方法中返回旧值

在IntoIter上调用.by_ref().Take().rev()时会发生什么情况

如何从ruust中的fig.toml中读取?

链表堆栈溢出

为什么编译器看不到这个 `From` impl?

为什么需要静态生命周期以及在处理 Rust 迭代器时如何缩小它?

在描述棋盘时如何最好地使用特征与枚举

将多维数组转换为切片

如何在Rust中使用Serde创建一个自定义的反序列化器来处理带有内部标记的枚举

我如何取消转义,在 Rust 中多次转义的字符串?

如何刷新 TcpStream

Rust,我如何正确释放堆分配的内存?

以下打印数组每个元素的 Rust 代码有什么问题?

为什么这个值在上次使用后没有下降?

使用 rust-sqlx/tokio 时如何取消长时间运行的查询

你能用 Rust 和 winapi 制作 Windows 桌面应用程序吗?