הטיפוסים המובנים
Zero נותנת לכם קבוצה קטנה וסדירה של טיפוסים פרימיטיביים. שום דבר אקזוטי, שום דבר מפתיע: רק אלה שכל שפת מערכות צריכה, עם שמות עקביים.
| משפחה | טיפוסים | הערות |
|---|---|---|
| מספרים שלמים עם סימן | i8, i16, i32, i64 | משלים ל-2. |
| מספרים שלמים בלי סימן | u8, u16, u32, u64 | 0 וחיוביים בלבד. |
| בגודל מצביע | usize, isize | הרוחב תואם למצביע של הפלטפורמה. |
| מספרים עשרוניים | f32, f64 | IEEE-754. |
| בוליאני | bool | true או false. |
| תו | char | ערך סקלרי יחיד של Unicode. |
| מחרוזת | String | מחרוזת UTF-8. |
| ריק | Void | "אין ערך שימושי." |
זו הרשימה המלאה של הפרימיטיביים שתיגעו בהם ביום-יום. טיפוסים מורכבים, shapes, enums, choices, בנויים מהם.
מספרים שלמים
טיפוסי המספרים השלמים עוקבים אחרי דפוס שמות אחיד: i לטיפוס עם סימן, u לטיפוס בלי סימן, ואחריהם רוחב הביטים. כך i32 הוא מספר שלם של 32 ביט עם סימן; u8 הוא בית בלי סימן; i64 הוא מספר שלם של 64 ביט עם סימן.
let small_signed: i8 = -120
let byte: u8 = 250
let id: i32 = 1
let big: i64 = 9_000_000_000
let index: usize = 0
ברירת המחדל לליטרל בלי סיומת היא i32, אלא אם ההקשר מסביב מחייב משהו אחר:
let answer = 42 // i32
כשצריך רוחב מסוים, הוסיפו סיומת לליטרל או ציינו את הטיפוס של הקישור:
let byte = 250_u8 // ליטרל עם טיפוס
let byte: u8 = 250 // קישור עם טיפוס
שתי הצורות מייצרות את אותו ערך. הצורה עם סיומת על הליטרל שימושית כשמעבירים ליטרל ישירות לפונקציה או בונים struct:
let pair: BytePair = Pair { left: 1_u8, right: 2_u8 }
איזה רוחב לבחור
כלל אצבע קצר:
i32לרוב החישובים עם סימן. רחב מספיק כמעט לכל דבר שתספרו, ומהיר בכל פלטפורמה.u8לעבודה ברמת הבית. בתים מקובץ, בתים במאגר, בתים ברשת.u32/u64לספירות לא שליליות כשהטווח חשוב. היסטים בקובץ מעל 2 GB, ספירות גדולות.usizeלגדלים ולאינדקסים. בגודל מצביע: תואם למה שהפלטפורמה משתמשת בו לכתובות זיכרון.i64לזמן מאז ה-epoch ודומיו. גדול מספיק לננו-שניות לאורך מאות שנים.
בחירת הטיפוס הקטן ביותר שמתאים היא הרגל טוב; בחירת טיפוס קטן מדי וגלישה היא בעיה גדולה בהרבה מבחירת טיפוס רחב בביט אחד מדי.
בוליאנים
let ok = true
let done: bool = false
ל-bool יש בדיוק שני ערכים: true ו-false. אלה ליטרלים, לא קבועים שמייבאים ממקום כלשהו. התנאי ב-if או ב-while הוא bool: אין truthiness מרומזת למספרים שלמים או למחרוזות.
if ok {
check world.out.write("yes\n")
} else {
check world.out.write("no\n")
}
If/else מכסה תנאים בפירוט.
מספרים עשרוניים
f32 ו-f64 הם מספרי נקודה צפה של 32 ביט ו-64 ביט לפי IEEE-754, בהתאמה. השתמשו בהם כשצריך ערכים שבריים: מדידות, יחסים, גאומטריה. לחשבון מדויק על כסף, העדיפו מספרים שלמים ביחידה הקטנה ביותר (אגורות, סנטים, satoshis) על פני מספרים עשרוניים.
let ratio: f32 = 0.5
let pi: f64 = 3.141592653589793
f64 הוא ברירת המחדל לליטרלים עשרוניים בלי סיומת.
תווים ומחרוזות
char מחזיק ערך סקלרי יחיד של Unicode:
let initial: char = 'Z'
String הוא רצף של תווים, שהספרייה הסטנדרטית מקודדת בדרך כלל כ-UTF-8. ליטרלים של מחרוזות משתמשים במירכאות כפולות:
let message: String = "hello from zero\n"
רצפי הבריחה הצפויים עובדים: \n לשורה חדשה, \t לטאב, \\ ללוכסן הפוך, \" למירכאות כפולות.
let multi_line = "line one\nline two\n"
הספרייה הסטנדרטית חושפת תצוגות ברמת הבית על מחרוזת לעבודה ברמה נמוכה. הצורה std.mem.span("zero") מחזירה Span<u8> על הבתים: שימושי כשמנתחים, מחשבים hash או משווים בית אחר בית.
Void
Void הוא הטיפוס של Zero ל"אין ערך החזרה שימושי". פונקציות שקיימות בשביל תופעות הלוואי שלהן משתמשות בו:
pub fun main(world: World) -> Void raises {
check world.out.write("hello\n")
}
main כותבת משהו וחוזרת. אין ערך להחזיר, ולכן הטיפוס הוא Void. תראו Void ברוב הפונקציות שנוגעות ב-World: בוחרים בהן בגלל האפקט שלהן, לא בגלל התוצאה.
קווים תחתונים בליטרלים מספריים
ליטרלים מספריים ארוכים יכולים להשתמש בקווים תחתונים כמפרידים ויזואליים. הקומפיילר מתעלם מהם, כך שזה פיצ'ר של קריאות בלבד:
let big = 9_000_000_000_i64
let bytes = 1_048_576_u32 // 1 MiB
הוסיפו אותם בכל מקום שבו קשה לספור את הספרות.
דף עזר לסיומות טיפוס של ליטרלים
| סיומת | טיפוס | דוגמה |
|---|---|---|
_i8 / _i16 / _i32 / _i64 | מספר שלם עם סימן | 127_i8 |
_u8 / _u16 / _u32 / _u64 | מספר שלם בלי סימן | 255_u8 |
_usize / _isize | בגודל מצביע | 0_usize |
_f32 / _f64 | מספר עשרוני | 0.5_f32 |
השתמשו בהן כשאתם בונים ערך וההקשר מסביב לא קובע את הטיפוס.
הבא בתור: פונקציות
לפרימיטיביים אין תועלת בלי משהו לעשות איתם. המסמך הבא מכסה פונקציות ב-Zero: איך מצהירים עליהן, מחזירים מהן ערכים ומחברים אותן יחד כדי לבנות תוכניות אמיתיות.
שאלות נפוצות
אילו טיפוסים פרימיטיביים יש ב-Zero?
Zero מגיעה עם מספרים שלמים עם סימן בגדלים קבועים i8, i16, i32, i64; מספרים שלמים בלי סימן u8, u16, u32, u64; מספרים שלמים בגודל מצביע usize ו-isize; מספרים עשרוניים f32 ו-f64; bool; char; String; ו-Void לפונקציות שלא מחזירות שום דבר שימושי.
מהו טיפוס המספר השלם שמוגדר כברירת מחדל ב-Zero?
ליטרל שלם בלי סיומת כמו 42 הוא i32 כברירת מחדל, אלא אם ההקשר מחייב טיפוס אחר. כדי להשתמש ברוחב מסוים, כתבו את הליטרל עם סיומת כמו 42_u8 או 42_i64, או ציינו במפורש את הטיפוס של הקישור עם let count: u8 = 42.
האם יש ב-Zero טיפוס מחרוזת נפרד?
כן. לליטרלים של מחרוזות כמו "hello" יש טיפוס מחרוזת מובנה שהספרייה הסטנדרטית מתייחסת אליו כרצף של בתים (לרוב UTF-8). לעבודה ברמת הבתים, הספרייה הסטנדרטית חושפת spans וכלים ברמת הבית; לפעולות ברמת התו יש char לערכים סקלריים בודדים.
מה המשמעות של Void ב-Zero?
Void הוא טיפוס ההחזרה של פונקציה שלא מייצרת ערך שימושי: היא קיימת רק בשביל תופעות הלוואי שלה. החתימה המקובלת pub fun main(world: World) -> Void raises משתמשת ב-Void כי main קיימת כדי לבצע קלט/פלט ולצאת, לא כדי לייצר ערך.
מה ההבדל בין i32 ל-u32 ב-Zero?
i32 הוא מספר שלם של 32 ביט עם סימן, בטווח −2,147,483,648 עד 2,147,483,647. u32 הוא בלי סימן, בטווח 0 עד 4,294,967,295. השתמשו בטיפוסים עם סימן כשלערכים שליליים יש משמעות, ובטיפוסים בלי סימן כשערך שלילי יהיה באג: לספירות, לאינדקסים, לגדלים וכן הלאה.