الرئيسية قاعدة المعرفة البرمجة والمنطق المتغيرات والأنواع في Rust: أساس كل برنامج صناعي
البرمجة والمنطق

المتغيرات والأنواع في 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 فقط عند الحاجة. نظام الأنواع صارم لكن ذكي: يستنتج الأنواع تلقائياً ويكشف الأخطاء وقت التجميع. الأنواع الأساسية (أعداد صحيحة وعشرية ومنطقيات ونصوص) تغطي كل ما تحتاجه لمعالجة بيانات المستشعرات والآلات. في الدرس القادم سنتعلم كيف يتخذ البرنامج قرارات ويكرر العمليات — الشروط والحلقات.

variables types mutability integers floating-point boolean المتغيرات الأنواع الثوابت الأعداد الصحيحة الأعداد العشرية نظام الأنواع