Проблема заимствования ржавчины с помощью метода get для структуры

Я новичок в Rust, поэтому все еще пытаюсь привыкнуть к языковой модели памяти.

Итак, я сталкиваюсь с ошибкой cannot move out of borrowed content. когда я строю getter метод по структуре. Я не мог понять, почему это так, но, похоже, это связано с некоторой чертой Enum.

enum Gender{
    Male,
    Female,
}
impl Default for Gender {
    fn default() -> Gender { Gender::Female }
}
impl Clone for Gender {
    fn clone(&self) -> Gender { *self }
}


#[derive(Default, Builder, Debug)]
#[builder(setter(into))]
struct ProfessorGroup {
    name: &'static str,
    gender:Gender,
    level:Levels,
    attrition_rate:f64,
    promotion_rate:f64,
    hiring_rate:f64,
    current_number:u32,
}
impl ProfessorGroup {
    pub fn get_gender(&self) -> Gender { self.gender }
    pub fn get_name(&self) -> &'static str {self.name}
    pub fn get_attrition_rate(&self) -> f64 {self.attrition_rate}

Полученное сообщение об ошибке связано с Enum для пола.

error[E0507]: cannot move out of borrowed content
  --> src/Actors/ProfessorGroups.rs:42:33

42 |     pub fn get_gender(&self) -> Gender { self.gender }
   |                                          ^^^^ cannot move out of borrowed content

error[E0507]: cannot move out of borrowed content
  --> src/Actors/ProfessorGroups.rs:27:33
   |
27 |     fn clone(&self) -> Levels { *self }
   |                                 ^^^^^ cannot move out of borrowed content

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

1 ответ

Решение

Проблема, с которой вы сталкиваетесь, заключается в том, что ни Gender ни ProfessorGroup являются Copy,

Просто добавив #[derive(Clone, Copy)] чтобы они оба решили ваши проблемы.


По умолчанию типы Rust являются аффинными. Это строгий отход от других языков, поэтому к нему нужно привыкнуть.

Аффинный тип - это тип, который можно употреблять (перемещать) не более одного раза: думайте о нем как о пироге, вы не можете иметь свой пирог и есть его слишком правильно? Торт аффинно!

Когда ты пишешь fn get_gender(&self) -> Gender { self.gender } ты пытаешься вернуться self.gender: это требует перемещения из self что не разрешено, потому что self это не твое это только заимствовано! (Вы не можете украсть чужой торт, просто посмотрите на него)

Есть несколько решений:

  • вместо этого вы можете вернуть ссылку: -> &Gender { &self.gender },
  • вы можете clone пол (если он реализует Clone): { self.gender.clone() },
  • вы можете иметь Gender воплощать в жизнь Copy,

Лично, когда типы могут реализовать CopyЯ бы порекомендовал, чтобы они сделали. Делает жизнь проще.

Другие вопросы по тегам