Avatar ·

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

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