ورقة Rust المرجعية
آخر تحديث
Hello World والبنية
برنامج Rust يبدأ من fn main؛ والعبارات تنتهي بفواصل منقوطة.
| العملية | الصياغة |
|---|---|
| نقطة الدخول | fn main() { ... } |
| طباعة سطر | println!("Hello, World!"); |
| الطباعة مع قيم | println!("{} is {}", name, age); |
| طباعة شكل التنقيح | println!("{:?}", value); |
| تعليق سطر | // comment |
| استخدام عنصر من وحدة | use std::collections::HashMap; |
| البناء والتشغيل | cargo run |
| بناء ثنائي للإصدار | cargo build --release |
المتغيرات والأنواع (let / mut)
الارتباطات غير قابلة للتغيير افتراضيًا؛ أضِف mut للسماح بإعادة الإسناد.
| العملية | الصياغة |
|---|---|
| ارتباط غير قابل للتغيير | let x = 5; |
| ارتباط قابل للتغيير | let mut count = 0; |
| نوع صريح | let age: u32 = 30; |
| ثابت | const MAX: u32 = 100; |
| التظليل (Shadowing) | let x = x + 1; |
| أنواع الأعداد الصحيحة | i32, u32, i64, usize |
| أنواع قياسية أخرى | f64, bool, char |
| صف (Tuple) | let pair: (i32, &str) = (1, "a"); |
| تحويل النوع | let f = x as f64; |
التحكم في التدفق
if تعبير، وتملك Rust ثلاثة أشكال للحلقات.
| العملية | الصياغة |
|---|---|
| If / else | if x > 0 { ... } else { ... } |
| If كتعبير | let y = if x > 0 { 1 } else { -1 }; |
| حلقة لا نهائية | loop { ... } |
| حلقة تُرجع قيمة | let v = loop { break 5; }; |
| حلقة while | while x < 100 { ... } |
| For على نطاق | for i in 0..10 { ... } |
| For على مجموعة | for item in &items { ... } |
| Break / continue | break;, continue; |
الدوال
آخر تعبير (دون فاصلة منقوطة) هو قيمة الإرجاع.
| العملية | الصياغة |
|---|---|
| دالة أساسية | fn add(a: i32, b: i32) -> i32 { a + b } |
| إرجاع صريح | fn f() -> i32 { return 5; } |
| دون قيمة إرجاع | fn log(msg: &str) { ... } |
| أخذ مرجع | fn len(s: &String) -> usize { s.len() } |
| إغلاق (closure) | let add = |a, b| a + b; |
| إغلاق بنوع | let sq = |x: i32| -> i32 { x * x }; |
| دالة كوسيط | fn apply(f: impl Fn(i32) -> i32) { ... } |
الملكية والاستعارة
لكل قيمة مالك واحد؛ والمراجع تستعيرها دون أخذ الملكية.
| العملية | الصياغة |
|---|---|
| نقل (تنتقل الملكية) | let b = a; (a لم تعد صالحة) |
| استنساخ (نسخ عميق) | let b = a.clone(); |
| استعارة غير قابلة للتغيير | let r = &x; |
| استعارة قابلة للتغيير | let r = &mut x; |
| الاستعارة في دالة | fn read(s: &String) { ... } |
| التفكيك (Dereference) | *r |
| قاعدة الاستعارة | العديد من & أو واحد &mut في كل مرة، لا كلاهما |
| شريحة (تستعير نطاقًا) | let part = &arr[1..3]; |
البُنى والتعدادات
البُنى تجمع البيانات المترابطة؛ والتعدادات تنمذج قيمة هي واحدة من عدة متغايرات.
| العملية | الصياغة |
|---|---|
| تعريف بنية | struct Point { x: i32, y: i32 } |
| إنشاء نسخة | let p = Point { x: 1, y: 2 }; |
| الوصول إلى حقل | p.x |
| بنية صف (tuple struct) | struct Pair(i32, i32); |
| دالة (كتلة impl) | impl Point { fn dist(&self) -> f64 { ... } } |
| دالة مرتبطة | impl Point { fn new() -> Self { ... } } |
| تعريف تعداد | enum Shape { Circle(f64), Rect(f64, f64) } |
| تعداد بحقول مسمّاة | enum Msg { Move { x: i32, y: i32 } } |
| اشتقاق السمات | #[derive(Debug, Clone)] |
مطابقة الأنماط (match)
match تقارن قيمة بالأنماط ويجب أن تكون شاملة.
| العملية | الصياغة |
|---|---|
| المطابقة على القيم | match x { 1 => "one", _ => "other" } |
| مطابقة تعداد | match shape { Shape::Circle(r) => ... } |
| مطابقة نطاق | match n { 1..=5 => ..., _ => ... } |
| الربط مع حارس | match x { n if n > 0 => ... } |
| مطابقة صف | match point { (0, y) => ..., (x, _) => ... } |
| if let (نمط واحد) | if let Some(v) = opt { ... } |
| while let | while let Some(v) = stack.pop() { ... } |
| تفكيك بنية | let Point { x, y } = p; |
السمات والأنواع العامة
السمات تُعرّف سلوكًا مشتركًا؛ والأنواع العامة تجعل الكود يعمل على أنواع كثيرة.
| العملية | الصياغة |
|---|---|
| تعريف سمة | trait Area { fn area(&self) -> f64; } |
| تنفيذ سمة | impl Area for Circle { fn area(&self) -> f64 { ... } } |
| دالة افتراضية | trait Greet { fn hi(&self) { ... } } |
| دالة عامة | fn largest<T: PartialOrd>(list: &[T]) -> &T { ... } |
| بنية عامة | struct Wrapper<T> { value: T } |
| قيد سمة (where) | fn f<T>(x: T) where T: Display { ... } |
| وسيط impl Trait | fn print(item: impl Display) { ... } |
| كائن سمة | let shapes: Vec<Box<dyn Area>> = ...; |
معالجة الأخطاء (Result / Option)
تنمذج Rust الغياب بـ Option والأخطاء القابلة للتعافي بـ Result.
| العملية | الصياغة |
|---|---|
| قيمة اختيارية | Option<T>: Some(v) أو None |
| نوع Result | Result<T, E>: Ok(v) أو Err(e) |
| إرجاع Result | fn read() -> Result<String, Error> { ... } |
| الانتشار بـ ? | let data = read()?; |
| Unwrap (تُحدث panic عند None/Err) | opt.unwrap() |
| قيمة افتراضية | opt.unwrap_or(0) |
| تحويل قيمة (Map) | opt.map(|v| v + 1) |
| معالجة كلا الفرعين | match res { Ok(v) => ..., Err(e) => ... } |
| تحويل Option إلى Result | opt.ok_or("missing")? |
المجموعات الشائعة (Vec / HashMap)
Vec مصفوفة قابلة للنمو؛ و HashMap مخزن مفتاح-قيمة.
| العملية | الصياغة |
|---|---|
| إنشاء متّجه (vector) | let mut v: Vec<i32> = Vec::new(); |
| متّجه حرفي | let v = vec![1, 2, 3]; |
| Push / pop | v.push(4);, v.pop(); |
| الوصول بالفهرس | v[0] |
| وصول آمن | v.get(0) يُرجع Option<&T> |
| التكرار | for x in &v { ... } |
| الطول | v.len() |
| إنشاء خريطة | let mut m: HashMap<String, i32> = HashMap::new(); |
| الإدراج / الحصول | m.insert(k, v);, m.get(&k) |
| واجهة Entry | *m.entry(k).or_insert(0) += 1; |
صياغة Rust التي تستخدمها أكثر من غيرها، على صفحة واحدة. ورقة Rust المرجعية هذه هي مرجع سريع للّغة الأساسية - المتغيرات والقابلية للتغيير، والملكية والاستعارة، والبُنى والتعدادات، ومطابقة الأنماط، والسمات والأنواع العامة، ونوعَي Result و Option خلف معالجة الأخطاء في Rust.
كل ما هنا هو Rust قياسية تُترجم على سلسلة أدوات مستقرة حديثة. انسخ ما تحتاجه، أو جرّب كل مقطع برمجي مباشرة في playground الخاص بـ Rust - دون الحاجة إلى تثبيت cargo.
الأسئلة الشائعة حول ورقة Rust المرجعية
هل ورقة Rust المرجعية هذه مجانية؟
ما هي الملكية والاستعارة في Rust؟
&x للاستعارة غير القابلة للتغيير أو &mut x للقابلة للتغيير. ويفرض المترجم قاعدة واحدة: يمكنك امتلاك العديد من الاستعارات غير القابلة للتغيير أو استعارة قابلة للتغيير واحدة بالضبط في كل مرة، ما يمنع تسابق البيانات في وقت الترجمة.ما الفرق بين Result و Option في Rust؟
Option<T> قيمة قد تكون غائبة - فهي إمّا Some(v) أو None، وتستخدمها عندما لا يوجد خطأ تُبلّغ عنه، بل مجرد قيمة مفقودة. أمّا Result<T, E> فيمثّل عملية قد تفشل - فهي إمّا Ok(v) أو Err(e)، وتحمل قيمة خطأ عند حدوث خلل. استخدم Option لـ "ربما موجودة" و Result لـ "قد تفشل هذه"؛ والعامل ? ينشر كليهما.