2017-05-08 42 views
2

我是Rust的新手,所以我仍然試圖習慣這種語言的內存模型。在結構上使用getter方法生鏽的借位問題

因此,當我在結構上構建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函數 - 但不知何故借用變得混亂了。

回答

4

您遇到的問題是:GenderProfessorGroup都不是Copy

簡單地將#[derive(Clone, Copy)]添加到他們兩個將解決您的問題。


默認情況下鏽病類型仿射。這是與其他語言的嚴格背離,所以需要一些習慣。

一個Affine類型是一種可以最多消耗(移動)的類型一次:將它想象成一個蛋糕,你不能擁有你的蛋糕並且把它吃掉對嗎?一個蛋糕是仿製的!

當你寫fn get_gender(&self) -> Gender { self.gender }你試圖返回self.gender:這需要移動出來的self這是不允許的,因爲self是不是你這只是借來的! (你不能偷別人的蛋糕,只要看看它)

有多種解決方案:

  • 你可以返回參考代替:-> &Gender { &self.gender }
  • 可以clone性別(如果它實現Clone):{ self.gender.clone() },
  • 你可以有Gender執行Copy

個人而言,當類型可以實現Copy,我會建議他們做的。讓生活更簡單。

+1

啊這是有道理的。我明白爲什麼吸氣功能仍被視爲借用。感謝複製,克隆特質的提示。這是一個非常有用的提示,因爲它看起來相當於按值傳遞/返回而不是通過引用。我很欣賞Rust在內存模型方面的明確解釋。 – krishnab