2016-10-16 4 views
3
pub struct Character { 
    name: String, 
    hp: i32, 
    level: i32, 
    xp: i32, 
    xp_needed: i32, 
    gold: i32 
} 

impl Character { 
    pub fn new(name: String) -> Character { 
     let mut rng = thread_rng(); 

     let hp: i32 = rng.gen_range(12, 75); 
     let gold: i32 = rng.gen_range(10, 50); 

     Character { name: name, hp: hp, level: 1, xp: 0, gold: gold, xp_needed: 100 } 
    } 

    pub fn get_name(&self) -> String { 
     self.name 
    } 

    // ... 
} 

Wie genau breche ich hier die Regeln?Kann nicht ausgeliehenen Inhalt in Rust bewegen

Auf einem hohen Niveau ist dies für Rust gegen den Strich. Sie können das Eigentum an etwas, das Sie geliehen haben, nicht übertragen, weil Sie es nicht besitzen.

Um nicht wahr? Ich habe andere Funktionen wie:

pub fn get_hp(&self) -> i32 { 
    self.hp 
} 

Und das funktioniert ganz gut.

| 
23 |   self.name 
    |   ^^^^ cannot move out of borrowed content 

error: aborting due to previous error 

Was ist los? Was ist der geeignete Ansatz, um den Charakternamen zurückzugeben? Warum funktioniert die get_hp Methode, aber nicht get_name?

+5

Es gibt [* so viele * andere Fragen für die gleiche Fehlermeldung] (http://stackoverflow.com/search?q=%5Brust%5D+move+out+of+borrowed+content+is % 3Aq). 'i32' ist' Copy', 'String' ist nicht. Du ** hast kein 'Selbst ', es ist geliehen (' & Selbst'). – Shepmaster

+0

@Shempmaster Das beantwortet meine Frage nicht oder gibt mir eine Lösung. – TheWebs

+3

TheWebs was @Shepmaster bedeutet ist, dass Sie einige Mühe in Ihrer Frage zeigen sollten, und wenn es andere Fragen gibt, die Ihren ähnlich sind, erklären Sie, warum ihre Antworten nicht auf Ihr Problem zutreffen. – mcarton

Antwort

8

Der Unterschied zwischen get_hp und get_name ist, dass get_hp eine i32 zurückgibt. i32 ist ein Copy Typ. Copy Typen können durch einfaches Kopieren von Bits kopiert werden und werden nie ausgefahren. Auf der anderen Seite String ist nicht Copy, es verwaltet einige Speicher, die entweder übertragen werden müssen (ausgezogen) oder Cloned.

Für Getter wie diese ist es idiomatischer, Referenzen anstelle von Klonen zurückzugeben. Und für String s sollte es speziell be &str.

pub fn get_name(&self) -> &str { 
    &self.name 
} 
Verwandte Themen