Memory management 在结构上使用getter方法时出现问题

Memory management 在结构上使用getter方法时出现问题,memory-management,struct,rust,borrowing,Memory Management,Struct,Rust,Borrowing,我是个新手,所以我仍在努力适应这种语言的记忆模式 因此,当我在结构上构建getter方法时,我遇到了一个错误无法移出借用的内容。。我不太明白为什么会这样,但它似乎与枚举中的某些特征有关 enum Gender{ Male, Female, } impl Default for Gender { fn default() -> Gender { Gender::Female } } impl Clone for Gender { fn clone(&s

我是个新手,所以我仍在努力适应这种语言的记忆模式

因此,当我在结构上构建
getter
方法时,我遇到了一个错误
无法移出借用的内容。
。我不太明白为什么会这样,但它似乎与枚举中的某些特征有关

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

我一定要提到赛尔夫。我也没有在这些函数中做任何赋值——只是在getter函数中——但不知何故,借用过程变得一团糟

您遇到的问题是
Gender
ProfessorGroup
都不是
Copy

只需将
#[派生(克隆,复制)]
添加到这两个选项中,即可解决您的问题


默认情况下,锈蚀类型是仿射的。这与其他语言完全不同,因此需要一些时间来适应

仿射类型是一种最多只能消费(移动)一次的类型:把它想象成一块蛋糕,你不能既有蛋糕又吃它,对吗?蛋糕是仿射的

当您编写
fn get_-gender(&self)->gender{self.gender}
时,您试图返回
self.gender
:这需要将其移出
self
,这是不允许的,因为
self
不是您的,它只是借用的!(你不能偷别人的蛋糕,看看吧)

有多种解决方案:

  • 您可以返回引用:
    ->&Gender{&self.Gender}
  • 您可以
    克隆
    性别(如果它实现了
    克隆
    ):
    {self.gender.clone()}
  • 您可以让
    性别
    执行
    复制

就个人而言,如果类型可以实现
复制
,我建议他们这样做。使生活更简单。

啊,这是有道理的。我明白为什么getter函数仍然被认为是借用的。谢谢你关于复制的提示,还有克隆特征。这是一个非常有用的技巧,因为它似乎相当于通过值传递/返回,而不是通过引用。我也很欣赏Rust中对记忆模型的清晰解释。