我是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 回答
你遇到的问题是
Gender
和ProfessorGroup
都不是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
时,我建议他们这样做 . 让生活更简单 .