首页 文章

使用结构上的getter方法的Rust借用问题

提问于
浏览
2

我是Rust的新手,所以我仍然习惯于习惯语言的内存模型 .

因此,当我在结构上构建 getter 方法时,我遇到了错误 cannot move out of borrowed content. . 我无法弄清楚为什么会这样,但它似乎与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

我确保参考了自己 . 我也没有在这些函数中做任何任务 - 只是getter函数 - 但不知何故借来的东西搞砸了 .

1 回答

  • 4

    你遇到的问题是 GenderProfessorGroup 都不是 Copy .

    只需将 #[derive(Clone, Copy)] 添加到它们中就可以解决您的问题 .


    默认情况下,Rust类型是仿射的 . 这是严格偏离其他语言,因此需要一些时间来适应 .

    仿射类型是一种最多可以被消费(移动)的类型:把它想象成一个蛋糕,你不能吃蛋糕,吃得太对吗?蛋糕是仿射!

    当你写 fn get_gender(&self) -> Gender { self.gender } 时,你试图返回 self.gender :这需要将它移出 self 这是不允许的,因为 self 不是你的's only borrowed! (You can' t偷别人蛋糕,只看一下)

    有多种解决方案:

    • 您可以返回引用: -> &Gender { &self.gender }

    • 你可以 clone 性别(如果它实现了 Clone ): { self.gender.clone() }

    • 你可以 Gender 实施 Copy .

    就个人而言,当类型可以实现 Copy 时,我建议他们这样做 . 让生活更简单 .

相关问题