2014-11-29 16 views
9

Der Rost mit gutem Beispiel Leitfaden zeigt den folgenden Code here für eine Fibonacci-Serie mit Iteratoren:mem :: ersetzen in Rust

fn next(&mut self) -> Option<u32> { 
    let new_next = self.curr + self.next; 
    let new_curr = mem::replace(&mut self.next, new_next); 

    // 'Some' is always returned, this is an infinite value generator 
    Some(mem::replace(&mut self.curr, new_curr)) 
} 

Ich möchte verstehen, was unser Vorteil ist dies über die intuitivste (wenn Sie aus anderen Sprachen kommen):

Antwort

10

Es ist nicht immer möglich, den direkten Code zu schreiben, da Rust Eigentümer ist. Wenn self.next einen Nicht-Copy-Typ speichert (z. B. Vec<T> für einen beliebigen Typ T), dann nimmt let tmp = self.next; diesen Wert von self by-value, das heißt Eigentumsübertragung, sodass die Quelle nicht verwendbar sein sollte. Aber die Quelle ist hinter einer Referenz und Verweise muss immer auf gültige Daten, so dass der Compiler kann nicht zulassen, dass aus &mut bewegen: Sie Fehler erhalten wie cannot move out of dereference of `&mut`-pointer.

replace umgeht diese Probleme über unsafe Code, indem intern die Garantie gemacht wird, dass jede Entwertung vollständig gültig ist, um die Zeit replace zurückgibt.

Sie this answer für weitere Informationen über Bewegungen im Allgemeinen sehen können, und this question für ein verwandtes Problem über eine swap Funktion (replace ist implementedthe standard library's swap mit intern).

+0

Danke für die Antwort. Es war sehr klar. Ich muss sagen, dass ich, obwohl ich den meisten Rust-Leitfäden gefolgt bin, immer noch nicht klar über bestimmte Dinge bin. Mit anderen Worten, ich kann ein Programm lesen/ändern, aber ich bin nicht sicher, ob ich die richtigen Entscheidungen treffen würde, wenn ich es von Grund auf neu machen müsste. Können Sie mir einen anderen Leitfaden vorschlagen? – Hernan

+0

@Hernan, es gibt [Rust by Example] (http://rustbyexample.com/), aber ich bin mir nicht sicher, ob Sie das suchen. Für "die richtigen Entscheidungen treffen" die Compiler-Fehler führen Sie theoretisch in die richtige Richtung, gibt es einige allgemeine Richtlinien wie "kann nicht aus ..." schlägt vor, eine Referenz oder eine Funktion wie 'ersetzen 'oder' swap' verwenden kann nicht ausleihen ... "schlägt vor, mehr' {} 'Bereiche zu verwenden. (Mit etwas Übung kann man vorhersagen, wann der Compiler beschwert sich und verwenden Sie das Update sofort, aber meine innere Dialog ist nach wie vor im Wesentlichen „der Compiler darüber beschweren“.) – huon

+0

ich hätte sagen sollen „die richtigen Entscheidungen“ in der Gestaltung. Ich werde weiterlesen und codieren. – Hernan