Есть ли рекомендуемый шаблон для определения, когда свойство объекта изменяется в Rust? - PullRequest
0 голосов
/ 07 января 2019

У меня есть приложение на C #, но некоторые его части имеют низкую производительность по ряду причин. Я хочу переписать эти части в Rust и взаимодействовать с моей новой нативной библиотекой, используя P / Invoke. Тем не менее, части моего кода, которые меня интересуют, это части, которые использовали INotifyPropertyChanged или Observable<T>.

Для справки, INotifyPropertyChanged - это шаблон, в котором класс, реализующий этот интерфейс (признак), будет инициировать событие (свойство "y" объекта x изменилось) каждый раз, когда изменяется одно из свойств класса, независимо от того, что вызвало изменение (типичное исключение - свойства, которые влияют на значения друг друга, чтобы избежать переполнения стека).

Для моего конкретного случая использования я пытаюсь отслеживать древовидную структуру, которая существует в моем коде Rust из C #. Было бы идеально, если бы у этих уведомлений об изменениях был способ пузыриться до корня дерева (то есть, если x.y[0].z изменяется, то y[0] запускает событие, которое видно по x, и x запускает событие).

Есть ли рекомендуемый шаблон для определения, когда свойство объекта изменяется в Rust? Например, есть ли способ узнать, когда свойство структуры заимствовано, и вызвать обратный вызов?

Я видел Как я могу реализовать шаблон наблюдателя в Rust? , но принятый ответ не полностью отвечает тому, что мне интересно.

1 Ответ

0 голосов
/ 07 января 2019

Есть ли рекомендуемый шаблон для определения того, когда свойство объекта изменяется в 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);
        }
    }
}

Кажется весьма вероятным, что процедурный макрос мог бы быть написан для автоматической генерации некоторых или всех аспектов этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...