首页 > 解决方案 > 是否有推荐的模式来找出对象的属性何时在 Rust 中更改?

问题描述

我有一个现有的 C# 应用程序,但由于多种原因,它的某些部分性能不佳。我想用 Rust 重写这些部分,并使用 P/Invoke 与我的新本机库进行交互。但是,我想知道的代码部分是使用INotifyPropertyChangedor的部分Observable<T>

作为参考,INotifyPropertyChanged是一种模式,其中实现该接口(特征)的类将在每次更改类的属性之一时触发一个事件(对象 x 上的属性“y”已更改),而不管是什么导致了更改(典型的例外是影响彼此值的属性,以避免堆栈溢出)。

对于我的特定用例,我试图从 C# 中跟踪存在于我的 Rust 代码中的树结构。如果这些更改通知能够冒泡到树的根部,那将是理想的(即,如果x.y[0].z发生更改,则y[0]触发一个事件,该事件被 看到x,并x触发一个事件)。

是否有推荐的模式来找出对象的属性何时在 Rust 中更改?例如,有没有办法知道何时借用结构的属性并触发回调?

我已经看到如何在 Rust 中实现观察者模式?,但接受的答案并没有完全解决我想知道的问题。

标签: rustobservablechange-tracking

解决方案


是否有推荐的模式来找出对象的属性何时在 Rust 中更改?

不,Rust 语言中没有这样的东西。据我所知,完全无法判断一个字段何时发生变化。

您将需要围绕属性编写方法。这些方法可以在更新值时执行您需要的任何副作用:

trait Observer {
    fn count_decreased(&mut self, example: &Example);
}

struct Example {
    name: String,
    count: u32,
}

impl Example {
    fn decrease_count(&mut self, observer: Option<impl Observer>) {
        self.count -= 1;
        if let Some(mut observer) = observer {
            observer.count_decreased(self);
        }
    }
}

可以编写一个程序宏来自动生成它的某些或所有方面,这似乎是非常合理的。


推荐阅读