1.5 - העברת בעלות העתקה ושכפול - פתרון
פתרון החזרת בעלות מפורשת¶
הפונקציה מקבלת בקשה בבעלות, ולכן היא רשאית לשנות את שדותיה ולהחזיר אותה. המשתנה הראשון נשאר מועבר, והמשתנה השני מקבל את ערך החזרה.
#[derive(Clone, Debug)]
struct Request {
name: String,
priority: u8,
}
fn normalize(mut request: Request) -> Request {
request.name.push_str(".job");
request
}
fn main() {
let request = Request { name: "scan".into(), priority: 2 };
let original = request.clone();
let normalized = normalize(request);
println!("{} {}", original.name, original.priority);
println!("{} {}", normalized.name, normalized.priority);
}
השכפול המפורש יוצר String נוספת לפני העברת הבקשה. אם אין צורך לשמור מקור, מסירים את השורה שיוצרת original ואת ההדפסה שלה. אין צורך לשכפל את הבקשה רק כדי להעביר אותה לפונקציה.
הפקת Copy נדחית משום ש־String אינה Copy. תיאור קטן של אחסון אינו אחסון חסר בעלות: הוא עדיין מציין אזור שצריך להשתחרר פעם אחת. שינוי השם בשני עותקים אינו הפתרון לבעיה; קודם צריך להגדיר אם שני התיאורים אמורים להיות בעלים עצמאיים או מבטים לאותו ערך.