memory-management - Rust 结构体上 getter 方法的借用问题

标签 memory-management struct rust borrowing

我是 Rust 新手,所以仍在努力适应该语言的内存模型。

因此,当我在结构上构建 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

我确保引用了 self。我也没有在这些函数中进行任何分配——只是 getter 函数——但不知何故,借用变得一团糟。

最佳答案

您遇到的问题是,GenderProfessorGroup 都不是Copy

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


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

仿射类型是最多可以被消耗(移动)一次的类型:把它想象成一个蛋糕,你不能既拥有蛋糕又吃掉它,对吗?蛋糕是仿射的!

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

有多种解决方案:

  • 您可以返回一个引用:-> &Gender { &self.gender },
  • 您可以克隆性别(如果它实现Clone):{ self.gender.clone() },
  • 您可以让Gender实现Copy

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

关于memory-management - Rust 结构体上 getter 方法的借用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43841496/

相关文章:

scala - Scala元组内存开销

c++ - 使用 STL 容器在 logN 中插入、查找最小值(键)和删除(基于值)功能?

c - 将 struct 作为参数传递以代替 void*

C# 通过继承隐藏结构体

rust - 为什么 rustc 编译这个 250 行的程序需要超过一分钟的时间,而 clang 需要不到一秒钟的时间?

C - 'malloc' 似乎无法正常工作

ios - 过度释放一个对象,应用程序不会崩溃

arrays - 如何在结构中初始化数组

rust - 如何在方法中调用闭包

rust - 我该如何对待泛型?