在结构上使用 getter 方法的 Rust 借用问题
Rust borrowing issue with a getter method on a struct
我是 Rust 的新手,所以我仍在努力适应该语言的内存模型。
因此,当我在结构上构建 getter
方法时,我 运行 陷入错误 cannot move out of borrowed content.
。我不太明白为什么会这样,但它似乎与枚举的某些特征有关。
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
。
只需将 #[derive(Clone, Copy)]
添加到它们中即可解决您的问题。
默认情况下,Rust 类型是仿射。这与其他语言完全不同,因此需要一些时间来适应。
一个Affine类型是最多可以被消耗(移动)一次的类型:把它想象成一个蛋糕,你不能吃你的蛋糕也吃它正确的?蛋糕是仿射的!
当您写 fn get_gender(&self) -> Gender { self.gender }
时,您正在尝试 return self.gender
:这需要将其移出 self
,这是不允许的,因为 self
是不是你的,只是借来的! (你不能偷别人的蛋糕,看看就好)
有多种解法:
- 您可以 return 一个 参考 代替:
-> &Gender { &self.gender }
,
- 你可以
clone
性别(如果它实现 Clone
):{ self.gender.clone() }
,
- 您可以让
Gender
实施 Copy
。
就个人而言,当类型 可以 实现 Copy
时,我建议他们这样做。让生活更简单。
我是 Rust 的新手,所以我仍在努力适应该语言的内存模型。
因此,当我在结构上构建 getter
方法时,我 运行 陷入错误 cannot move out of borrowed content.
。我不太明白为什么会这样,但它似乎与枚举的某些特征有关。
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
。
只需将 #[derive(Clone, Copy)]
添加到它们中即可解决您的问题。
默认情况下,Rust 类型是仿射。这与其他语言完全不同,因此需要一些时间来适应。
一个Affine类型是最多可以被消耗(移动)一次的类型:把它想象成一个蛋糕,你不能吃你的蛋糕也吃它正确的?蛋糕是仿射的!
当您写 fn get_gender(&self) -> Gender { self.gender }
时,您正在尝试 return self.gender
:这需要将其移出 self
,这是不允许的,因为 self
是不是你的,只是借来的! (你不能偷别人的蛋糕,看看就好)
有多种解法:
- 您可以 return 一个 参考 代替:
-> &Gender { &self.gender }
, - 你可以
clone
性别(如果它实现Clone
):{ self.gender.clone() }
, - 您可以让
Gender
实施Copy
。
就个人而言,当类型 可以 实现 Copy
时,我建议他们这样做。让生活更简单。