Avatar ·

في 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() فهي تنسخ فقط.