2

我是 Rust 的新手,所以仍在尝试习惯该语言的内存模型。

cannot move out of borrowed content.因此,当我在结构上构建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 函数——但不知何故,借用变得一团糟。

4

1 回答 1

4

您遇到的问题是既不是Gender也不ProfessorGroupCopy

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


默认情况下,Rust 类型是affine。这是与其他语言的严格背离,因此需要一些时间来适应。

仿射类型是一种最多只能食用(移动)一次的类型:把它想象成一个蛋糕,你不能把你的蛋糕也吃掉吧?蛋糕是仿射的!

当您写信时,fn get_gender(&self) -> Gender { self.gender }您正试图归还self.gender:这需要将其移出,self这是不允许的,因为self它不是您的,只是借来的!(不能偷别人的蛋糕,看看就好)

有多种解决方案:

  • 您可以改为返回参考-> &Gender { &self.gender }: ,
  • 你可以clone性别(如果它实现Clone{ self.gender.clone() }:,
  • 你可以有Gender实现Copy

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

于 2017-05-08T07:11:51.947 回答