كيفية تحويل الأنواع الرقمية بأمان وبطريقة Idiomatic في Rust؟
مرحباً بالجميع! لقد بدأت للتو في تعلم Rust بعد C++ وPython، وواجهت مشكلة خطيرة في تحويل الأرقام. في C++ اعتدت ببساطة كتابة `(int)my_float` أو `static_cast(value)`، وكان كل شيء يعمل. لكن في Rust، يشتكي المترجم باستمرار.
إليك الموقف المحدد: أنا أكتب برنامجاً يحسب المتوسط الحسابي. لدي مصفوفة من الأعداد الصحيحة، وأحتاج إلى الحصول على النتيجة كرقم عشري.
```rust
fn average(numbers: &[i32]) -> f64 {
let sum: i32 = numbers.iter().sum();
sum / numbers.len() as f64 // هذا يعمل، لكنه يبدو غير مرتب
}
```
يبدو أنه يعمل، لكني أشعر أن هذا غير صحيح. بالإضافة إلى ذلك، عندما أحاول إجراء التحويل العكسي — من `f64` إلى `i32` — يظهر المترجم خطأ بأنه لا يمكن ببساطة أخذ القيمة وتحويلها. على سبيل المثال:
```rust
let x: f64 = 3.14;
let y: i32 = x as i32; // هذا يعمل، لكن يتم فقدان البيانات
```
أفهم أن Rust يهتم بالسلامة، لكن كيف يمكن التحويل بشكل صحيح؟