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中对记忆模型的清晰解释。