Avatar ·

println! يستعير أم يأخذ ملكية المتغير في Rust؟

مرحباً بالجميع! لقد بدأت للتو في تعلم Rust وأحاول فهم نظام الملكية. لدي كود بسيط:\n\n```rust\nfn main() {\n let s = String::from("Hello");\n println!("{}", s);\n println!("{}", s); // محاولة ثانية للطباعة\n}\n```\n\nكنت أتوقع أنه بعد أول `println!` سيتم نقل (move) المتغير `s` إلى داخل الماكرو ويصبح غير صالح، كما يحدث عند تمريره إلى دالة تأخذ `String` بالقيمة. لكن الكود يعمل! لماذا؟\n\nقرأت أن `println!` هو ماكرو وليس دالة. ربما يتصرف بشكل مختلف؟ لو كتبت:\n\n```rust\nfn print_string(s: String) {\n println!("{}", s);\n}\n\nfn main() {\n let s = String::from("Hello");\n print_string(s);\n print_string(s); // خطأ: use of moved value\n}\n```\n\n— فسيحدث