На ржавчины сеттеры - PullRequest
0 голосов
/ 01 марта 2019

Я искал в Переполнении стека способы установки значений в объявленной изменяемой структуре.Ответы не выглядели однозначно, и для меня они слишком далеко отошли от простоты, которой я наслаждаюсь.В конечном итоге я обнаружил, что этот код работает так, как нужно:

struct FooStruct {
    bar: i32,
}

impl FooStruct {

    fn set(&mut self, val: i32){
        //*self.first_name_mut() = val;
        *(&mut self.bar) = val;
    }

}

fn main() {
    let mut k = 45;
    let mut my_person = FooStruct { bar: 2};

    println!("Fn: {}", my_person.bar);
    my_person.set(k);
    println!("Fn: {}", my_person.bar); //value is printed as 45
    k = 33; // set k-value
    println!("Fn: {}", my_person.bar); //the value in the struct remains as 45, unchanged
}

Обратите внимание, насколько просто реализовать сеттер:

*(&mut self.bar) = val;

Мой вопрос: есть ли ловушка?к этой простоте установки значения?Люди зашли так далеко, что создали макросы для получения / установки, поэтому мне интересно, почему этот метод не используется.Я пришел из Java-земли, где настройка - это бессмысленная сделка (this.value = input);по прибытии туда, где живут рустики, я ожидал, что реализация функций, подобных ООП, будет неприятной для реализации.

Хотя я надеюсь, что этот пост поможет людям реализовать сеттер, я также хочу, чтобы опытный пользователь объяснил, что за строка кода вышеделает так же, как и любые подводные камни, которые я (возможно, еще) не видел.

1 Ответ

0 голосов
/ 01 марта 2019

Изменчивость наследуется от родительского объекта, в данном случае «my_person», потому что он был объявлен как «mut».Таким образом, как указал Бенджамин Линдли, все, что вам нужно сделать, это заменить:

*(&mut self.bar) = val;

на:

self.bar = val;

Урок: изменчивость распространяется от родительского объекта вниз в структуру, еслиобъект объявлен изменяемым

...