Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

ورقة 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 / elseif x > 0 { ... } else { ... }
If كتعبيرlet y = if x > 0 { 1 } else { -1 };
حلقة لا نهائيةloop { ... }
حلقة تُرجع قيمةlet v = loop { break 5; };
حلقة whilewhile x < 100 { ... }
For على نطاقfor i in 0..10 { ... }
For على مجموعةfor item in &items { ... }
Break / continuebreak;, 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 letwhile 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 Traitfn print(item: impl Display) { ... }
كائن سمةlet shapes: Vec<Box<dyn Area>> = ...;

معالجة الأخطاء (Result / Option)

تنمذج Rust الغياب بـ Option والأخطاء القابلة للتعافي بـ Result.

العمليةالصياغة
قيمة اختياريةOption<T>: Some(v) أو None
نوع ResultResult<T, E>: Ok(v) أو Err(e)
إرجاع Resultfn 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 إلى Resultopt.ok_or("missing")?

المجموعات الشائعة (Vec / HashMap)

Vec مصفوفة قابلة للنمو؛ و HashMap مخزن مفتاح-قيمة.

العمليةالصياغة
إنشاء متّجه (vector)let mut v: Vec<i32> = Vec::new();
متّجه حرفيlet v = vec![1, 2, 3];
Push / popv.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 المرجعية هذه مجانية تمامًا، دون الحاجة إلى التسجيل. أضِفها إلى المفضلة وارجع إليها متى احتجت إلى البحث عن نمط match أو قيد سمة أو دالة مجموعة.
ما هي الملكية والاستعارة في Rust؟
الملكية هي نموذج الذاكرة في Rust: لكل قيمة مالك واحد بالضبط، وتُحرَّر القيمة عند خروج ذلك المالك من النطاق. أمّا الاستعارة فتتيح لك الوصول إلى قيمة دون أخذ ملكيتها باستخدام مرجع - &x للاستعارة غير القابلة للتغيير أو &mut x للقابلة للتغيير. ويفرض المترجم قاعدة واحدة: يمكنك امتلاك العديد من الاستعارات غير القابلة للتغيير أو استعارة قابلة للتغيير واحدة بالضبط في كل مرة، ما يمنع تسابق البيانات في وقت الترجمة.
ما الفرق بين Result و Option في Rust؟
يمثّل Option<T> قيمة قد تكون غائبة - فهي إمّا Some(v) أو None، وتستخدمها عندما لا يوجد خطأ تُبلّغ عنه، بل مجرد قيمة مفقودة. أمّا Result<T, E> فيمثّل عملية قد تفشل - فهي إمّا Ok(v) أو Err(e)، وتحمل قيمة خطأ عند حدوث خلل. استخدم Option لـ "ربما موجودة" و Result لـ "قد تفشل هذه"؛ والعامل ? ينشر كليهما.
هل يمكنني التدرّب على Rust عبر الإنترنت؟
نعم. افتح playground الخاص بـ Rust لترجمة وتشغيل أيّ مقطع برمجي من هذه الورقة المرجعية في متصفحك - دون الحاجة إلى تثبيت cargo أو سلسلة أدوات. وعندما ترغب في تعلّم منظّم، تأخذك دورة Rust التفاعلية المجانية من Coddy من المتغيرات والملكية إلى السمات ومعالجة الأخطاء خطوة بخطوة.
هل هذه الورقة المرجعية مناسبة للمبتدئين؟
نعم. إنها مرتّبة من المواضيع الأكثر شيوعًا (المتغيرات والتحكم في التدفق والدوال) وصولًا إلى المتقدمة (السمات والأنواع العامة ومعالجة الأخطاء)، بحيث يمكنك استخدام الأقسام العلوية من اليوم الأول والتدرّج إلى الملكية والبقية.
Coddy programming languages illustration

تعلّم Rust مع Coddy

ابدأ الآن