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
}
```
— فسوف...