Ok, hier das spezifische Problem nicht in der Lage ist, sein aus geliehenen Inhalte zu bewegen. Dies war answerednumeroustimesbefore unter einer Vielzahl von Bedingungen, nicht the chapter on the subject of ownership in the Rust Book zu erwähnen.
Die interessantere ist über Getter und Setter. Ja, Sie können schreiben Sie in Rust, aber sie können nicht die beste Wahl sein.
Bevor ich gehe, ich möchte nur beachten, dass es gibt absolut keinen Grund-&mut self
auf einem Getter erforderlich ... es sei denn, Sie beabsichtigen, den Wert als Teil des Entfernens des Wertes, zu modifizieren, aber dann bist du nicht mehr wirklich mit einem Getter.
Zweitens Sie sollte nichtclone
in einem Getter. Dies ist sehr verschwenderisch, wenn der Benutzer beispielsweise nur den Wert lesen möchte. Es ist besser, eine unveränderliche borrow zurückzukehren, aus denen der Benutzer kann clone
wenn sie müssen.
Wie auch immer, wenn Sie diese gerade schreiben, weil Sie irgendeine Art von Logik laufen wollen, um neue Werte zu überprüfen, halten Setter verwenden. Andernfalls könnten Sie so etwas tun:
#[derive(Default)]
struct Person {
first_name: String,
last_name: String,
}
impl Person {
// Immutable access.
fn first_name(&self) -> &String {
&self.first_name
}
fn last_name(&self) -> &String {
&self.last_name
}
// Mutable access.
fn first_name_mut(&mut self) -> &mut String {
&mut self.first_name
}
fn last_name_mut(&mut self) -> &mut String {
&mut self.last_name
}
}
fn main() {
let mut my_person = Person::default();
*my_person.first_name_mut() = String::from("John");
*my_person.last_name_mut() = "Doe".into();
println!("first_name: {}", my_person.first_name());
println!("last_name: {}", my_person.last_name());
// Can't do this efficiently with getter/setter!
{
let s = my_person.last_name_mut();
s.truncate(2);
s.push('w');
}
println!("first_name: {}", my_person.first_name());
println!("last_name: {}", my_person.last_name());
}
Dies gibt dem Anwender mehr oder weniger direkten Zugriff auf die Felder, ohne tatsächlich sie direkten Zugriff auf die Felder zu geben. Zusätzlich zum Schreiben neuer Werte können Benutzer vorhandene Werte auch direkt mutieren, was für große, dem Heap zugewiesene Dinge wichtig sein kann.
Außerdem habe ich noch ein paar andere Änderungen:
können Sie einfach ableiten mechanisch Default
; Es gibt keinen Grund in diesem Fall, es selbst zu schreiben.
Konventioneller Stil ist snake_case
für Felder.
Die Art, wie Sie die Person
erstellt wurde, war unnötig Kreisverkehr.
Warum denken Sie, Sie brauchen Getter und Setter? Warum nicht 'struct Person {pub Vorname: String, Pub Nachname: String,}' was ist einfacher? –