بعد أن قمت بتثبيت وإعداد بيئة عمل Rust، حان الوقت للتعمق في أساسيات هذه اللغة القوية. سنتعلم كيفية التعامل مع أنواع البيانات المختلفة، كيفية قراءة الإدخال من المستخدم، ونظرة عامة على كيفية عمل الذاكرة في Rust.
Rust تدعم مجموعة متنوعة من أنواع البيانات التي تساعد في تحديد البيانات بدقة وآمان. هناك أنواع أساسية ومتقدمة مثل:
الأعداد الصحيحة: تستخدم للقيم الصحيحة اي الارقام الصحيحة . مثال:
rust
let my_integer: i32 = 42;
الأعداد العشرية: تستخدم للأرقام العشرية. مثال:
rust
let my_float: f64 = 3.14;
القيم المنطقية: تستخدم للقيم true/false. مثال:
rust
let is_rust_fun: bool = true;
الأحرف: تستخدم لتمثيل الأحرف Unicode. مثال:
rust
let my_char: char = 'A';
السلاسل الحرفية: تستخدم لتخزين النصوص. مثال:
rust
let my_string: String = String::from("مرحباً رست");
للقراءة من المستخدم، نستخدم std::io::stdin() وللطباعة نستخدم println!. على سبيل المثال:
use std::io;
fn main() {
println!("أدخل اسمك:");
let mut input = String::new();
io::stdin().read_line(&mut input).expect("فشل قراءة الإدخال");
println!("مرحباً, {}", input.trim());
}
للطباعة النصوص إلى التيرمنال في Rust، نستخدم ما يسمى بالماكرو println!، الذي يتيح لنا إدخال قيم متغيرة داخل النص المراد طباعته. على سبيل المثال:
fn main() {
let name = "أحمد";
let age = 30;
println!("مرحباً, {}! عمرك هو {}", name, age);
}
| الخصائص | الـ Heap | الـ Stack |
|---|---|---|
| التعريف | منطقة ذاكرة تُستخدم لتخزين البيانات التي تم إنشاؤها في وقت التشغيل. | منطقة ذاكرة تُستخدم لتخزين المتغيرات المعرفة في وقت الترجمة. |
| الإدارة | يتم إدارة الـ Heap يدويًا من خلال عمليات التخصيص والتحرير والإفراج عن الذاكرة. | يتم إدارة الـ Stack تلقائيًا من قبل Rust، حيث يتم إنشاء وإزالة المتغيرات بناءً على نطاقها. |
| الحجم والمدة | يمكن أن تكون البيانات في الـ Heap أكبر حجمًا وتعيش لفترة زمنية أطول. | حجم البيانات في الـ Stack محدود وتعيش لفترة زمنية قصيرة، حيث يتم إزالتها تلقائيًا عند انتهاء نطاقها. |
| الاستخدام النمطي | يستخدم الـ Heap للبيانات الديناميكية مثل السلاسل النصية والبيانات المُخصصة. | يستخدم الـ Stack للمتغيرات الأساسية والبيانات الثابتة التي يتم تحديدها في وقت الترجمة. |
fn main() {
// مثال على التخزين في Stack
let greeting = "مرحبا";
let name = "رست";
println!("{}، {}!", greeting, name);
}
في هذا المثال، يتم تخزين النصوص greeting و name في الـ Stack لأنها نصوص ثابتة ولا يمكن تغييرها.
fn main() {
// الـ Heap: تخزين سلسلة نصية ديناميكية
let mut s = String::from("اهلا برست");
// تعديل السلسلة النصية في الـ Heap
s.push_str(" معدلة في ال Heap");
// الطباعة من الـ Heap
println!("{}", s); // سلسلة نصية معدلة في الـ Heap
}
في هذا المثال، يتم تخزين السلسلة النصية s في الـ Heap لأنها سلسلة ديناميكية يمكن تغيير حجمها.
فهم الفرق بين الـ Heap والـ Stack مهم لتصميم برامج Rust فعالة وآمنة. الـ Stack تُستخدم لتخزين البيانات التي يمكن الوصول إليها بسرعة والتي تُحذف تلقائيًا عند انتهاء النطاق، مثل المتغيرات الأساسية الثابتة. بالمقابل، الـ Heap تُستخدم لتخزين البيانات الديناميكية التي يمكن أن تكون أكبر حجمًا وتحتاج إلى إدارة يدوية للذاكرة، مثل السلاسل النصية التي يمكن تعديلها خلال وقت التشغيل.
عند كتابة برامج بلغة Rust، عليك التفكير في كيفية إدارة البيانات بفعالية لتحقيق الأداء الأمثل وتجنب التسريبات في الذاكرة. على سبيل المثال، استخدم الـ Stack للبيانات الثابتة والبسيطة التي لا تحتاج إلى تغييرات كبيرة، واستخدم الـ Heap للبيانات التي تحتاج إلى مرونة أكبر في الحجم والعمر الافتراضي.
بفهم هذا التوزيع واستخدام الأدوات المتاحة في Rust مثل println! للطباعة وstd::io::stdin() للإدخال، يمكنك كتابة برامج قوية وآمنة تعتمد على مبادئ إدارة الذاكرة الحديثة. Rust توفر ميزات فريدة مثل امتلاك البيانات وقروض البيانات (ownership and borrowing) التي تساعد على ضمان الأمان في الذاكرة ومنع الأخطاء الشائعة مثل الاستخدام المزدوج للذاكرة أو التسريبات.
ابدأ بكتابة برامج بسيطة وراقب كيف يتم تخزين وإدارة البيانات فيها، ثم انتقل إلى تطبيقات أكثر تعقيدًا تستفيد من إمكانيات Rust الكاملة. مع الوقت والممارسة، ستصبح أكثر كفاءة في استخدام هذه اللغة القوية.