المتغيرات والأنواع في Rust: أساس كل برنامج صناعي
المتغيرات: ثابتة افتراضياً
في معظم لغات البرمجة، المتغيرات قابلة للتغيير تلقائياً. Rust تعكس هذا المنطق: كل متغير ثابت (immutable) ما لم تطلب صراحة جعله متغيراً. لماذا؟ لأن البيانات التي لا تتغير أسهل في التحليل وأكثر أماناً — خاصة في بيئة صناعية حيث قراءة مستشعر لا يجب أن تتغير بعد تسجيلها.
fn main() {
let sensor_id = 42; // ثابت — لا يمكن تغييره
// sensor_id = 43; // خطأ تجميع! لا يمكن تعديل متغير ثابت
let mut temperature = 23.5; // متغير — يمكن تعديله
temperature = 24.1; // مسموح
println!("المستشعر {}: {:.1}°C", sensor_id, temperature);
}
القاعدة بسيطة: استخدم let للثوابت (الافتراضي) و let mut للمتغيرات التي تحتاج تعديلها.
الأنواع الأساسية: الأعداد والمنطقيات
Rust لغة ذات أنواع ثابتة (statically typed) — كل قيمة لها نوع مُحدد وقت التجميع. لكن المُجمِّع ذكي بما يكفي لاستنتاج الأنواع تلقائياً في معظم الحالات.
الأعداد الصحيحة
| النوع | الحجم | المدى | الاستخدام الصناعي |
|---|---|---|---|
i8 |
8 بت | -128 إلى 127 | إشارة تحكم صغيرة |
u8 |
8 بت | 0 إلى 255 | بايت Modbus |
i16 |
16 بت | -32768 إلى 32767 | سجل مستشعر مع إشارة |
u16 |
16 بت | 0 إلى 65535 | سجل Modbus خام |
i32 |
32 بت | ±2 مليار | الافتراضي للأعداد |
u32 |
32 بت | 0 إلى 4 مليار | عدّاد إنتاج |
i64 |
64 بت | ±9.2 × 10¹⁸ | طوابع زمنية |
u64 |
64 بت | 0 إلى 18.4 × 10¹⁸ | معرّف فريد |
let modbus_register: u16 = 0xFFFF; // سجل Modbus: 16 بت بدون إشارة
let production_count: u32 = 150_000; // عدّاد إنتاج — الشرطة السفلية للقراءة
let sensor_reading: i16 = -150; // قراءة مستشعر قد تكون سالبة
الأعداد العشرية
| النوع | الدقة | الاستخدام |
|---|---|---|
f32 |
32 بت (~7 أرقام) | حيث الذاكرة محدودة |
f64 |
64 بت (~15 رقم) | الافتراضي — الأدق |
let temperature: f64 = 36.6; // درجة حرارة بدقة عالية
let pressure: f32 = 1013.25; // ضغط جوي — دقة f32 كافية
المنطقيات
let is_running: bool = true; // هل الآلة تعمل؟
let alarm_active = false; // الاستنتاج التلقائي: bool
الأحرف والنصوص
Rust تفرّق بين الحرف والنص:
let grade: char = 'A'; // حرف واحد — بين علامات مفردة
let status: &str = "تعمل"; // نص ثابت — مرجع لسلسلة أحرف
let name: String = String::from("CNC-Mill-07"); // نص مُمتلَك — يمكن تعديله
&str(string slice): نص ثابت مُخزّن في الذاكرة الثابتة — لا يمكن تعديلهString: نص على الكومة (heap) — يمكن إضافة أحرف وتعديله
let mut log_entry = String::from("Machine started");
log_entry.push_str(" at 08:00"); // إضافة نص
println!("{}", log_entry); // Machine started at 08:00
الثوابت والمتغيرات الثابتة
بالإضافة لـ let، يوفر Rust طريقتين لتعريف قيم لا تتغير أبداً:
// const: قيمة ثابتة وقت التجميع — تُستبدل في مكانها
const MAX_TEMPERATURE: f64 = 120.0;
const SENSOR_COUNT: usize = 256;
// static: متغير عمره طول البرنامج — له عنوان ثابت في الذاكرة
static FACTORY_NAME: &str = "Dr. Machine Plant Alpha";
متى تستخدم أيّاً منهما؟
constلقيم المعايرة والحدود (مثل حدود درجة الحرارة)staticلقيم تحتاج عنوان ذاكرة ثابت (نادر الاستخدام)
التعليقات التوضيحية للأنواع والاستنتاج التلقائي
المُجمِّع يستنتج الأنواع في معظم الحالات:
let x = 5; // المُجمِّع يستنتج: i32
let y = 3.14; // المُجمِّع يستنتج: f64
let active = true; // المُجمِّع يستنتج: bool
لكن أحياناً تحتاج تحديد النوع صراحة:
// عند التحويل من نص إلى رقم — المُجمِّع لا يعرف أي نوع رقم تريد
let value: u16 = "1024".parse().expect("Not a number");
// عند تعريف مجموعة فارغة — لا يوجد عنصر يستنتج منه
let readings: Vec<f64> = Vec::new();
التظليل: إعادة استخدام الأسماء بأمان
Rust تسمح بتظليل (shadowing) المتغيرات — إعادة تعريف متغير بنفس الاسم:
let reading = "42.5"; // نوعه &str
let reading: f64 = reading.parse().unwrap(); // نوعه f64 — ظلّل الأول
let reading = reading * 1.8 + 32.0; // الآن درجة فهرنهايت
println!("القراءة: {:.1}°F", reading);
التظليل يختلف عن mut:
mut: نفس النوع، نفس المتغير، قيمة مختلفة- التظليل: يمكن تغيير النوع كلياً — كأنك أنشأت متغيراً جديداً
هذا مفيد جداً في خطوط معالجة البيانات الصناعية: تأخذ قراءة خام كنص، تحوّلها لرقم، ثم تُعايرها — كل مرة بنفس الاسم المنطقي.
الخلاصة
المتغيرات في Rust ثابتة افتراضياً — أضف mut فقط عند الحاجة. نظام الأنواع صارم لكن ذكي: يستنتج الأنواع تلقائياً ويكشف الأخطاء وقت التجميع. الأنواع الأساسية (أعداد صحيحة وعشرية ومنطقيات ونصوص) تغطي كل ما تحتاجه لمعالجة بيانات المستشعرات والآلات. في الدرس القادم سنتعلم كيف يتخذ البرنامج قرارات ويكرر العمليات — الشروط والحلقات.