האם Rust טובה למבני נתונים ואלגוריתמים?
לשימוש בהם, מאוד: האוספים הסטנדרטיים מהירים ומתועדים היטב, sort יציב, ו־Rust בטוחה שוללת מצביעים תלויים ומרוצי נתונים בזמן הקומפילציה, בלי איסוף זבל. לכתיבת מבנים מבוססי מצביעים, היא קשה יותר מ־C או מ־Java, כי הבעלות שוללת קישורים משותפים וניתנים לשינוי אלא אם בוחרים ב־Rc וב־RefCell, ורשימה מקושרת דו־כיוונית או עץ עם מצביעים להורה עשויים בדיוק מאלה. הקושי הזה הוא גם השיעור: ברגע שאתם יכולים לכתוב אותם ב־Rust, אתם יודעים בדיוק למי שייך מה.
איזה אוסף של Rust מתאים לאיזה מבנה נתונים?
Vec<T> הוא מערך דינמי והמחסנית שלכם, VecDeque<T> הוא מאגר מעגלי והתור שלכם, HashMap ו־HashSet הם טבלאות גיבוב (SipHash כברירת מחדל, שעמיד בפני התנגשויות מכוונות במחיר מסוים של מהירות), BTreeMap ו־BTreeSet הם עצי B מסודרים, BinaryHeap<T> היא ערימת מקסימום, ו־LinkedList<T> היא רשימה מקושרת דו־כיוונית שרק לעתים רחוקות תעדיפו על פני Vec או VecDeque. אין טיפוס של trie או גרף; אותם אתם בונים.
למה כל כך קשה לכתוב רשימה מקושרת ב־Rust?
כי לכל ערך יש בדיוק בעלים אחד. רשימה מקושרת חד־כיוונית מתאימה לכלל הזה: כל צומת מחזיק בבעלות את הבא דרך Option<Box<Node>>. רשימה מקושרת דו־כיוונית או עץ עם קישורים להורה לא מתאימים, כי לכל צומת מובילים שני מצביעים, ולכן פונים ל־Rc<RefCell<Node>> עם Weak לקישורים האחוריים, או שומרים את הצמתים ב־Vec ומקשרים ביניהם לפי אינדקס. Learning Rust With Entirely Too Many Linked Lists קיים כי כל כך הרבה אנשים נתקעים בדיוק כאן.
איך מקבלים ערימת מינימום ב־Rust?
BinaryHeap<T> היא ערימת מקסימום, אז עטפו כל פריט ב־std::cmp::Reverse: דחפו Reverse(x) וה־x הקטן ביותר יוצא ראשון. ל־Dijkstra, דחפו Reverse((distance, node)), והזוג מושווה קודם לפי המרחק. אחרי שכתבתם ערימה בעצמכם בשלב השני, להפוך את הסדר שלה זה מובן מאליו.
אילו קורסים במסלול הזה לא נלמדים ב־Rust?
שלושה: תכנות דינמי וסדרת הראיונות של Python, שנלמדים ב־Python, ומניפולציית ביטים, שנלמדת ב־C++. הם מופיעים אחרי השלבים, כל אחד עם קישור שפותח אותו בשפה שלו. טבלת memo ב־Rust היא Vec או HashMap, וגלישה של מספר שלם גורמת ל־panic בבניית debug, כך שטריק ביטים שמסתמך על גלישה מעגלית כותב זאת במפורש עם wrapping_add או wrapping_mul.
האם צריך לדעת Rust לפני שמתחילים את המסלול?
בעלות, השאלה (borrowing), structs, enums ו־Option, לכל הפחות; Box ו־traits עוזרים. אם הם חדשים לכם, קורס Rust של Coddy מביא אתכם לשם קודם, בחינם, והמסלול הזה ממשיך מהמקום שבו הוא מסתיים.