Rust/מערכים: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Steeve815 (שיחה | תרומות)
מ הוספת קטגוריה:Rust באמצעות HotCat
Steeve815 (שיחה | תרומות)
עדכון: <source> → <syntaxhighlight>
שורה 13:
הצהרה על מערך תעשה בצורה הבאה:
 
<sourcesyntaxhighlight lang = "rust">
let <name>: [<type>; <size>] = [ <values> ];
</syntaxhighlight>
</source>
כאשר name ('''שם המערך''') הוא השם שאנו בוחרים למערך כולו, type ('''טיפוס המערך''') הוא טיפוס המשתנה של המערך ו-size ('''גודל המערך'''), שחייב להיות מספר שלם חיובי, הוא מספר האיברים שיכיל המערך. values ('''איברי המערך''') הם האיברים שאנחנו נשים בכל אחד מתאי המערך והם יופרדו ביניהם בפסיקים, אשר יתחמו בסוגריים מרובעות.
 
נתבונן בדוגמת הקוד הבאה:
<sourcesyntaxhighlight lang = "rust">
let array1: [char; 3] = ['a', 'b', 'c'] ;
let array2 = [1, 2, 3];
let mut array3: [f64; 10];
</syntaxhighlight>
</source>
# השורה הראשונה מכריזה על מערך של תווים בשם array1 בעל שלושה איברים. האיבר הראשון הוא 'a', האיבר השני הוא 'b' והאיבר השלישי הוא 'c'. שימו לב שהמערך מוגדר כ-immutable כברירת מחדל ולכן לא נוכל לשנות את איברי המערך.
# השורה השנייה מכריזה על מערך של מספרים שלמים בשם array2 שגם בו שלושה איברים. שימו לב שלא חובה לציין את גודל המערך ואת סוג המשתנה מפני שכאשר מאתחלים את האיברים של המערך, הקומפיילר יודע לזהות את הסוג שלו ואת הגודל אוטומטית.
שורה 31:
כדי לגשת לאיבר במערך, נשתמש ב'''אינדקס''' שלו - נכתוב את שם המערך ואחריו בתוך סוגריים מרובעים את המספר הסידורי של האיבר במערך:
 
<sourcesyntaxhighlight lang = "rust">
println!("{}", array1[2]);
</syntaxhighlight>
</source>
בדוגמה זו, הדפסנו את המשתנה שהאינדקס שלו הוא 2 במערך array1.
 
שימו לב כי בדומה לשפות תכנות רבות, גם בשפת Rust נהוג כי האינדקס הראשון במערך הוא 0 ולא 1. כלומר,
<sourcesyntaxhighlight lang = "rust">
array1[0]
</syntaxhighlight>
</source>
הוא האיבר הראשון במערך. כתוצאה מכך, האיבר האחרון במערך בגודל n הוא בעל המספר הסידורי {{משמאל לימין|n - 1}}. אם נצהיר על מערך בגודל 10:
<sourcesyntaxhighlight lang = "rust">
let mut my_array: [u8; 10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
</syntaxhighlight>
</source>
האיבר האחרון שנוכל לגשת אליו הוא האיבר באינדקס ה-9 ({{משמאל לימין|my_array[9]}}). אם ננסה לגשת לאיבר באינדקס ה-10 נקבל שגיאת קומפילציה:
 
<sourcesyntaxhighlight lang = "rust">
my_array[10]; // error: index out of bounds: the len is 10 but the index is 10
</syntaxhighlight>
</source>
 
באותו אופן, ניתן לבצע השמה לאיברי המערך:
<sourcesyntaxhighlight lang = "rust">
let mut leet = [1, 2, 3, 4];
leet[1] = 3;
שורה 57:
 
// leet is now [1, 3, 3, 7]
</syntaxhighlight>
</source>
 
שימו לב שכמו כל המשתנים האחרים שלמדנו עד כה בשפת ראסט, מערכים מוגדרים כ-immutable כברירת מחדל ואם נרצה לשנות את האיברים שלהם במהלך התוכנית, נצטרך להוסיף להם את המילה mut.
שורה 66:
נניח שהיינו רוצים לכתוב תוכנית שמדפיסה את ממוצע הציונים שתלמיד קיבל בארבעה מבחנים. עד עכשיו, בעזרת הכלים שלמדנו היינו יכולים לעשות זאת כך:
 
<sourcesyntaxhighlight lang = "rust">
let first_grade = 90;
let second_grade = 80;
שורה 74:
println!("The averege grade is {}",
(first_grade + second_grade + third_grade + fourth_grade) as f64 / 4 as f64);
</syntaxhighlight>
</source>
 
אבל מה אם היו לנו ציונים של 10 מבחנים? או אם המורה של התלמיד ממש הגזים והיו לנו 100 ציונים? זה היה מאוד לא נוח ליצור 100 משתנים בזה אחרי זה ואחרי כן לשלוח את כולם באותה שורה להדפסה... ובכן, בדיוק בשביל זה יש לנו מערכים!
שורה 80:
את אותו הקוד של התוכנית למעלה יכולנו לכתוב בצורה הבאה:
 
<sourcesyntaxhighlight lang = "rust">
let grades = [80, 90, 56, 100];
let mut sum_of_grades = 0;
שורה 90:
}
println!("The averege grade is {}", sum_of_grades as f64 / 4 as f64);
</syntaxhighlight>
</source>
 
אם היו לנו יותר ציונים, לא היינו צריכים לשנות את הקוד בהרבה:
 
<sourcesyntaxhighlight lang = "rust">
let grades = [80, 90, 56, 100, 92, 96, 75, 80, 100, 91];
let mut sum_of_grades = 0;
שורה 104:
}
println!("The averege grade is {}", sum_of_grades as f64 / 10 as f64);
</syntaxhighlight>
</source>
 
=== הטיפוסים usize ו-isize ===
שורה 113:
=== {{עשה}} - קבלת אורך המערך ===
ניתן לקבל את אורכו של המערך על ידי שימוש בפונקציה .len(). לדוגמה:
<sourcesyntaxhighlight lang = "rust">
let my_array = [1, 2, 3, 4];
let x = my_array.len();
שורה 119:
 
// output: the array's length is: 4
</syntaxhighlight>
</source>
 
=== {{אל תעשה}} - השמה למערך לא מאותחל ===
לא ניתן לבצע פעולת השמה על אף איבר במערך לא מאוחל, גם אם הוא הוגדר כ-muttable.
<sourcesyntaxhighlight lang = "rust">
let mut my_array: [i32; 10];
my_array[5] = 5; // error: use of possibly uninitialized variable: `my_array`
</syntaxhighlight>
</source>
הסיבה לכך היא שכאשר המחשב מתרגם את הקוד שלנו ל[[אסמבלי x86|שפת סף]], הוא בדרך כלל משתמש באינדקס הראשון של המערך כדי לגשת לאינדקס המסויים אותו אנו רוצים. כך, אם הערך הראשון של המערך לא אותחל, המחשב יוכל לגשת לערך זבל לא מאותחל. כזכור, אחד הדגשים העיקריים של שפת ראסט הוא בטיחות לפני הכל, ולכן וכדי למנוע מצב דומה למצב שתואר, הוחלט לא לאפשר באופן גורף גישה לאיברים במערך לא מאותחל (לא משנה באיזה איבר מדובר).
 
=== {{עשה}} - אתחול כל איברי המערך עם ערך קבוע ===
ניתן לאתחל את כל האיברים של מערך מסויים עם ערך קבוע:
<sourcesyntaxhighlight lang = "rust">
let mut my_array = [value; length];
</syntaxhighlight>
</source>
בדוגמה מעל, בערך value נרשום את הקבוע שאנחנו רוצים שישוכפל וב-length את האורך של המערך.{{ש}}בדרך כלל נבחר לאתחל מערכים של מספרים עם המספר 0, למשל:
<sourcesyntaxhighlight lang = "rust">
let mut my_array = [0; 10]; // my_array is [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
</syntaxhighlight>
</source>
 
=== {{אל תעשה}} - יצירת מערך בגודל משתנה ===
לא ניתן ליצור מערך בגודל של משתנה מסויים. בהמשך נלמד מספר פתרונות להתגבר על בעיה זו.
<sourcesyntaxhighlight lang = "rust">
let length = 10;
let mut my_array = [0; length]; // error: attempt to use a non-constant value in a constant
</syntaxhighlight>
</source>
 
=== {{עשה}} - יצירת מערך בגודל משתנה קבוע ===
למרות האמור בסעיף הקודם, ניתן ליצור מערך בגודל של משתנה קבוע (שהוגדר כ-const). שימו לב שהטיפוס של הקבוע חייב להיות usize.
<sourcesyntaxhighlight lang = "rust">
const length: usize = 10;
let mut my_array = [0; length];
</syntaxhighlight>
</source>
 
=== {{אל תעשה}} - אתחול חלק מאיברי המערך ===
לא ניתן לאתחל רק את חלק מאיברי המערך עם ערך קבוע כלשהו.
<sourcesyntaxhighlight lang = "rust">
let mut array1: [0; 10] = [0; 5]; // error: expected an array with a fixed size of 10 elements, found one with 5 elements
let mut array2: [0; 8] = [0, 3; 4, 5]; // error: wrong syntax
let mut array3: [0; 8] = [[0; 3], 4, 5]; // error: wrong syntax
</syntaxhighlight>
</source>
 
=== {{עשה}} - השמת מערך אחד לתוך מערך אחר בעל גודל זהה ===