2017-05-08 6 views
2

Ich bin neu in Rust, so bin immer noch versucht, sich an das Speichermodell der Sprache zu gewöhnen.Rust Borrowing Problem mit einer Getter-Methode auf einer Struktur

Also ich renne in einen Fehler cannot move out of borrowed content., wenn ich eine -Methode auf einer Struktur erstellen. Ich konnte nicht wirklich herausfinden, warum es so ist, aber es scheint sich auf eine Eigenschaft auf einem Enum zu beziehen.

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} 

Die Fehlermeldung erhalte ich muss mit dem Enum für Geschlecht zu tun.

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 

Ich habe darauf geachtet, einen Verweis auf sich selbst zu nehmen. Ich habe auch keine Aufgabe in diesen Funktionen gemacht - nur getter Funktionen - aber irgendwie wird das Ausleihen kaputt gemacht.

Antwort

4

Das Problem, auf das Sie stoßen, ist, dass weder Gender noch ProfessorGroupCopy sind.

Einfach hinzufügen #[derive(Clone, Copy)] zu beiden von ihnen würde Ihre Probleme lösen.


standardmäßig Rust Typen sind affine. Dies ist eine strenge Abkehr von anderen Sprachen, daher ist es gewöhnungsbedürftig.

Ein Affine Typ ist ein Typ, der höchstens einmal verzehrt werden kann: Denken Sie daran wie ein Kuchen, Sie können nicht Ihren Kuchen haben und es auch zu essen, richtig? Ein Kuchen ist affin!

Wenn Sie fn get_gender(&self) -> Gender { self.gender } schreiben Sie versuchen self.gender zurückzukehren: dies erfordert es aus self bewegt, die nicht erlaubt ist, weil self liegt bei Ihnen nicht nur geliehen hat! (Sie können nicht jemanden anderen Kuchen stehlen, nur es betrachtet)

Es gibt mehrere Lösungen:

  • Sie stattdessen eine Referenz zurückgeben können: -> &Gender { &self.gender },
  • Sie das Geschlecht clone kann (Wenn es implementiert Clone): { self.gender.clone() },
  • können Sie Gender implementieren Copy implementieren.

Persönlich, wenn Typen Copy umsetzen können, würde ich empfehlen, sie tun. Macht das Leben einfacher.

+1

Ah das macht Sinn. Ich verstehe, warum die Getter-Funktion immer noch als Kredit betrachtet wurde. Danke für den Tipp auf die Copy, Clone Traits auch. Das ist so ein nützlicher Tipp, denn es scheint, als würde man Wert nach Wert anstatt nach Referenz weitergeben. Ich schätze auch die klare Erklärung des Speichermodells in Rust. – krishnab

Verwandte Themen