משתנים גלובליים הם משתנים שאפשר לגשת אליו מכל מקום בתוכנה ללא קשר להיקף. הם נקבעים על ידי התחלה עם תו $ (סימן דולר). עם זאת, השימוש במשתנים גלובליים נחשב לעיתים קרובות ל"לא-רובי ", ולעתים נדירות תראה אותם.
הגדרת משתנים גלובליים
משתנים גלובליים מוגדרים ומשתמשים בהם כמו כל משתנה אחר. כדי להגדיר אותם, פשוט הקצה להם ערך והתחל להשתמש בהם. אולם, כפי ששמם מרמז, להתייחסות למשתנים גלובליים מכל נקודה בתוכנית יש השלכות כלל-עולמיות. התוכנית הבאה מדגימה זאת. השיטה תשנה משתנה גלובלי וזה ישפיע על האופן בו שנייה השיטה פועלת.
מהירות $ = 10. def להאיץ. מהירות $ = 100. סוף. def pass_speed_trap. אם מהירות $> 65. # תן לתוכנית כרטיס מהיר. סוף. סוף. להאיץ. pass_speed_trap.
לא פופולרי
אז מדוע זה "un-Ruby" ומדוע אינך רואה משתנים גלובליים לעיתים קרובות מאוד? במילים פשוטות, זה שובר את האקפסולציה. אם מחלקה או שיטה אחת מסוגלות לשנות את מצב המשתנים הגלובליים כרצונם ללא שכבת ממשק כלשהי שיעורים או שיטות אחרים המסתמכים על משתנה גלובלי עשויים להתנהג בצורה בלתי צפויה ולא רצויה אופן. יתר על כן, אינטראקציות מסוג זה יכולות להיות קשות מאוד לניפוי באגים. מה שינה את המשתנה הגלובלי ההוא ומתי? אתה תעבור דרך די הרבה קוד כדי למצוא מה עשה את זה, והיה אפשר להימנע מכך שלא לשבור את כללי האינפסולציה.
אבל זה לא אומר שמשתנים גלובליים הם כאלה לעולם לא משמש ברובי. ישנם מספר משתנים גלובליים מיוחדים עם שמות בעלי תווים יחידים (א-לה) פרל) שניתן להשתמש בהן לאורך כל התוכנית שלך. הם מייצגים את מצב התוכנית עצמה ועושים דברים כמו לשנות את הרשומות ומפרידי השדות לכולם מקבל שיטות.
משתנים גלובליים
- $0 - משתנה זה, שמסומן על ידי $ 0 (זהו אפס), מכיל את שם התסריט ברמה העליונה שמבוצע. במילים אחרות, קובץ הסקריפט שהופעל מה- שורת פקודה, לא את קובץ הסקריפט המחזיק את קוד ההפעלה הנוכחי. אז אם script1.rb הופעל משורת הפקודה, זה היה מחזיק script1.rb. אם סקריפט זה דורש script2.rb, $ 0 בקובץ סקריפט זה יהיה גם script1.rb. השם 0 $ משקף את מוסכמת השמות הנהוגה בתסריטים של פגזי UNIX לאותה מטרה.
- $* - טיעוני שורת הפקודה במערך שמצוין $ * (סימן דולר וכוכבית). לדוגמה, אם היית רץ ./script.rb arg1 arg2, אז $ * יהיה שווה ערך ל % w {arg1 arg2}. זה שווה ערך למיוחד ARGV מערך ויש לו שם פחות תיאורי, כך שהוא משמש לעיתים רחוקות.
- $$ - מזהה התהליך של המתורגמן, המצוין על ידי $$ (שני שלטי דולר). הכרת מזהה התהליך של עצמו היא לרוב שימושית בתוכנות דמון (הפועלות ברקע, ללא חיבור למסוף כלשהו) או בשירותי מערכת. עם זאת, הדבר מסתבך מעט יותר כאשר מדובר בחוטים, לכן היזהר משימוש בו באופן עיוור.
- $ / ו- $ \ - אלה מפרידי רשומות הקלט והפלט. כשאתה קורא אובייקטים באמצעות מקבל ולהדפיס אותם באמצעות מכניס, הוא משתמש באלו כדי לדעת מתי נקרא "רשומה" שלמה, או מה להדפיס בין רשומות מרובות. כברירת מחדל, אלה אמורים להיות הדמות החדשה. אך מכיוון שאלו משפיעים על התנהגותם של כל אובייקטי ה- IO, הם משמשים לעיתים רחוקות, אם בכלל. אתה עשוי לראות אותם בסקריפטים קטנים יותר שבהם הפרת כללי האקפסולציה אינה עניין.
- $? - מצב היציאה של התהליך האחרון לילד שהוצא להורג. מבין כל המשתנים המפורטים כאן, זה כנראה הכי שימושי. הסיבה לכך היא פשוטה: אינך יכול לקבל את סטטוס היציאה של תהליכי ילדים לפי ערך ההחזר שלהם מה- מערכת שיטה, נכונה או שגויה בלבד. אם עליכם לדעת את ערך ההחזר בפועל של תהליך הילד, עליכם להשתמש במשתנה גלובלי מיוחד זה. שוב, שמו של משתנה זה נלקח מפגזי UNIX.
- $_ - המחרוזת האחרונה שקרא מקבל. משתנה זה עשוי להיות נקודת בלבול אצל הבאים לרובי מפרל. בפרל, משתנה $ _ פירושו משהו דומה, אך שונה לחלוטין. בפרל, $_ מחזיקה בערך ההצהרה האחרונה וברובי היא מחזיקה במחרוזת שהוחזרה על ידי הקודמת מקבל פתיחה. השימוש בהם דומה, אך מה שהם באמת מחזיקים זה מאוד שונה. גם לעתים קרובות אינך רואה משתנה זה (תחשוב על זה, לעיתים רחוקות אתה רואה אף אחד מהמשתנים האלה), אך אתה עשוי לראות אותם בתוכניות רובי קצרות מאוד המעבדות טקסט.
בקיצור, לעתים רחוקות תראה משתנים גלובליים. לעיתים קרובות הם צורה גרועה (וגם "un-Ruby") ורק שימושיים באמת בתסריטים קטנים מאוד, שם ניתן להעריך את ההשלכה המלאה של השימוש בהם. ישנם כמה משתנים גלובליים מיוחדים שניתן להשתמש בהם, אך לרוב הם אינם משמשים. אתה לא באמת צריך לדעת כל כך הרבה על משתנים גלובליים כדי להבין את רוב תוכניות האודם, אבל אתה צריך לפחות לדעת שהם שם.