Rust Cheat Sheet: דף עזר מהיר
עודכן לאחרונה
Hello World ומבנה
תוכנית Rust מתחילה ב-fn main; פקודות מסתיימות בנקודה-פסיק.
| פעולה | תחביר |
|---|---|
| נקודת כניסה | fn main() { ... } |
| הדפסת שורה | println!("Hello, World!"); |
| הדפסה עם ערכים | println!("{} is {}", name, age); |
| הדפסה בפורמט debug | println!("{:?}", value); |
| הערת שורה | // comment |
| שימוש בפריט ממודול | use std::collections::HashMap; |
| בנייה והרצה | cargo run |
| בניית קובץ הרצה ל-release | cargo build --release |
משתנים וטיפוסים (let / mut)
קישורים (bindings) הם בלתי ניתנים לשינוי כברירת מחדל; הוסיפו 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) { ... } |
| קבלת הפניה (reference) | fn len(s: &String) -> usize { s.len() } |
| Closure | let add = |a, b| a + b; |
| Closure עם טיפוס | let sq = |x: i32| -> i32 { x * x }; |
| פונקציה כארגומנט | fn apply(f: impl Fn(i32) -> i32) { ... } |
Ownership ו-borrowing
לכל ערך יש בעלים אחד; הפניות שואלות אותו בלי לקחת בעלות.
| פעולה | תחביר |
|---|---|
| Move (העברת בעלות) | let b = a; (a כבר לא תקף) |
| Clone (העתקה עמוקה) | let b = a.clone(); |
| השאלה בלתי ניתנת לשינוי | let r = &x; |
| השאלה שניתנת לשינוי | let r = &mut x; |
| השאלה בפונקציה | fn read(s: &String) { ... } |
| Dereference | *r |
| כלל ההשאלה | הרבה & או &mut אחד בכל רגע נתון, לא שניהם |
| Slice (השאלה של טווח) | let part = &arr[1..3]; |
Structs ו-enums
Structs מקבצים נתונים קשורים; enums מתארים ערך שהוא אחת מכמה אפשרויות (variants).
| פעולה | תחביר |
|---|---|
| הגדרת struct | 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 | enum Shape { Circle(f64), Rect(f64, f64) } |
| Enum עם שדות בשם | enum Msg { Move { x: i32, y: i32 } } |
| גזירת traits (derive) | #[derive(Debug, Clone)] |
Pattern matching (match)
match משווה ערך מול תבניות וחייב לכסות את כל המקרים.
| פעולה | תחביר |
|---|---|
| match על ערכים | match x { 1 => "one", _ => "other" } |
| match על enum | match shape { Shape::Circle(r) => ... } |
| match על טווח | match n { 1..=5 => ..., _ => ... } |
| קישור עם תנאי (guard) | match x { n if n > 0 => ... } |
| match על tuple | match point { (0, y) => ..., (x, _) => ... } |
| if let (תבנית יחידה) | if let Some(v) = opt { ... } |
| while let | while let Some(v) = stack.pop() { ... } |
| פירוק struct | let Point { x, y } = p; |
Traits ו-generics
Traits מגדירים התנהגות משותפת; generics מאפשרים לקוד לעבוד עם הרבה טיפוסים.
| פעולה | תחביר |
|---|---|
| הגדרת trait | trait Area { fn area(&self) -> f64; } |
| מימוש trait | impl Area for Circle { fn area(&self) -> f64 { ... } } |
| מתודת ברירת מחדל | trait Greet { fn hi(&self) { ... } } |
| פונקציה גנרית | fn largest<T: PartialOrd>(list: &[T]) -> &T { ... } |
| struct גנרי | struct Wrapper<T> { value: T } |
| הגבלת trait (where) | fn f<T>(x: T) where T: Display { ... } |
| ארגומנט impl Trait | fn print(item: impl Display) { ... } |
| Trait object | 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 הוא מאגר של מפתח וערך.
| פעולה | תחביר |
|---|---|
| יצירת ווקטור | 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() |
| יצירת map | let mut m: HashMap<String, i32> = HashMap::new(); |
| הכנסה / קבלה | m.insert(k, v);, m.get(&k) |
| Entry API | *m.entry(k).or_insert(0) += 1; |
התחביר של Rust שאתם צריכים הכי הרבה, בעמוד אחד. ה-Rust cheat sheet הזה הוא דף עזר מהיר לליבת השפה: משתנים ו-mutability, ownership ו-borrowing, structs ו-enums, pattern matching, traits ו-generics, והטיפוסים Result ו-Option שעומדים מאחורי הטיפול בשגיאות ב-Rust.
כל מה שכאן הוא Rust סטנדרטי שמתקמפל בגרסת stable עדכנית. העתיקו את מה שאתם צריכים, או נסו כל קטע קוד בזמן אמת בעורך האונליין של Rust, בלי להתקין cargo.
שאלות נפוצות על ה-Rust cheat sheet
האם ה-Rust cheat sheet הזה חינמי?
מה זה ownership ו-borrowing ב-Rust?
&x להשאלה בלתי ניתנת לשינוי או &mut x להשאלה שניתנת לשינוי. הקומפיילר אוכף כלל אחד: בכל רגע נתון אפשר להחזיק הרבה השאלות בלתי ניתנות לשינוי או בדיוק השאלה אחת שניתנת לשינוי, וכך נמנעים מרוצי נתונים (data races) כבר בזמן הקומפילציה.מה ההבדל בין Result ל-Option ב-Rust?
Option<T> מייצג ערך שעשוי להיות חסר: הוא Some(v) או None, ומשתמשים בו כשאין שגיאה לדווח עליה, רק ערך חסר. Result<T, E> מייצג פעולה שעלולה להיכשל: הוא Ok(v) או Err(e), ונושא ערך שגיאה כשמשהו משתבש. השתמשו ב-Option עבור "אולי קיים" וב-Result עבור "זה עלול להיכשל"; האופרטור ? מעביר את שניהם הלאה.