Проблема заимствования ржавчины с помощью метода 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
Я бы порекомендовал, чтобы они сделали. Делает жизнь проще.