في Rust: ما الفرق بين `clone()` و `to_owned()` ومتى يستخدم كل منهما؟
مرحبًا أيها الزملاء! لقد بدأت في تعلم Rust مؤخرًا وأخلط باستمرار بين طريقتي clone() و to_owned(). يبدو أن كلاهما ينشئ نسخة من البيانات، لكن في التوثيق مكتوب أنهما شيئان مختلفان. عمليًا، أرى أنه يمكن استدعاء clone() على أي نوع ينفذ trait Clone، بينما to_owned() فقط على الأنواع التي تحتوي على trait ToOwned. لكن أليس هذا نفس الشيء؟
إليك مثال محدد يربكني:
```rust
let s: &str = "hello";
let a: String = s.to_owned();
let b: String = s.to_string(); // يعمل أيضًا
// لماذا لا أستطيع كتابة s.clone() للحصول على String؟
// لأن clone() يُرجع &str، وليس String!
```
مثال آخر: أعمل مع الشرائح (slices). لدي &[i32]، وأريد الحصول على Vec. يمكنني فعل slice.to_owned() — هذا يعمل. لكن إذا فعلت slice.clone()، سأحصل على &[i32] مرة أخرى، وليس Vec. لماذا؟
أشعر أن to_owned() هي طريقة سحرية "تحول" البيانات المستعارة إلى بيانات مملوكة. أما clone() فهي تنسخ فقط.