שיטת "דרוש" ברובי

על מנת ליצור רכיבים הניתנים לשימוש חוזר, אלה שניתן להשתמש בהם בקלות בתוכנות אחרות, שפת תכנות חייבת להיות בדרך כלשהי לייבא את הקוד בצורה חלקה בזמן ההפעלה. בתוך רובי, ה דורשים שיטה משמשת לטעינת קובץ אחר ולהפעלת כל אותו הצהרות. זה משמש לייבוא ​​כל המחלקות ו- שיטה הגדרות בקובץ. בנוסף לביצוע פשוט של כל ההצהרות בקובץ, שיטת הדרישה עוקבת גם אחר הקבצים שנדרשו בעבר ולכן לא תידרש קובץ פעמיים.

בשיטת 'דורש'

שיטת הדרישה לוקחת את שם הקובץ לדרוש, בתור מחרוזת, כטיעון יחיד. זה יכול להיות נתיב לקובץ, כגון ./lib/some_library.rb או שם מקוצר, כגון כמה ליברלים. אם הארגומנט הוא נתיב ושם קובץ מלא, שיטת הדרישה תחפש שם את הקובץ. עם זאת, אם הטיעון הוא שם מקוצר, שיטת הדרישה תחפש במספר ספריות שהוגדרו מראש במערכת שלך אחר אותו קובץ. השימוש בשם המקוצר הוא הדרך הנפוצה ביותר להשתמש בשיטת הדרישה.

הדוגמה הבאה מדגימה כיצד להשתמש בהצהרת הדרישה. הקובץ test_library.rb נמצא בבלוק הקוד הראשון. קובץ זה מדפיס הודעה ומגדיר כיתה חדשה. גוש הקוד השני הוא הקובץ test_program.rb. קובץ זה טוען את ה- test_library.rb הקובץ באמצעות therequiremethod ויוצר חדש מבחן קלס חפץ.

instagram viewer
מכניס "test_library כלול"
מבחן בכיתה
def לאתחל
מציב את "אובייקט TestClass שנוצר"
סוף
סוף
#! / usr / bin / env אודם
דורש 'test_library.rb'
t = TestClass.new

הימנע מעימותי שמות

בעת כתיבת רכיבים לשימוש חוזר, עדיף שלא להכריז על משתנים רבים בהיקף הגלובלי מחוץ לשיעורים או שיטות כלשהם או באמצעות $ קידומת. זה כדי למנוע משהו שנקרא "זיהום מרחב שמות"אם אתה מצהיר יותר מדי שמות, תוכנית או ספרייה אחרת עשויים להכריז על אותו שם ולגרום להתנגשות בשמות. כששתי ספריות לא קשורות לחלוטין מתחילות לשנות זו את זו במשתנה בטעות, הדברים ישברו - לכאורה באופן אקראי. זהו באג קשה מאוד לאיתור ועדיף פשוט להימנע ממנו.

כדי למנוע עימותים עם שמות, אתה יכול לכלול את כל הספרייה שלך בתוך א מודול הצהרה. זה ידרוש מאנשים להתייחס לשיעורים ולשיטה שלך בשם מוסמך לחלוטין כמו MyLibrary:: my_method, אבל זה שווה מכיוון שבדרך כלל לא יתרחשו עימותים עם שם. לאנשים שרוצים שכל שמות הכיתות והשיטות שלך יהיו בהיקף הגלובלי, הם יכולים לעשות זאת באמצעות ה- לכלול הצהרה.

הדוגמה הבאה חוזרת על הדוגמה הקודמת, אך סוגרת את כל האפשרויות ב- הספריה שלי מודול. שתי גרסאות של my_program.rb ניתנים; כזו המשתמשת ב- לכלול הצהרה וכזו שלא.

מכניס "test_library כלול"
מודול MyLibrary
מבחן בכיתה
def לאתחל
מציב את "אובייקט TestClass שנוצר"
סוף
סוף
סוף
#! / usr / bin / env אודם
דורש 'test_library2.rb'
t = MyLibrary:: TestClass.new
#! / usr / bin / env אודם
דורש 'test_library2.rb'
כולל את MyLibrary
t = TestClass.new

הימנע מנתיבים מוחלטים

מכיוון שמרכיבים לשימוש חוזר לרוב עוברים דירה, עדיף שלא להשתמש בנתיבים מוחלטים בשיחות הדורשות שלך. נתיב מוחלט הוא נתיב כמו /home/user/code/library.rb. תבחין כי הקובץ חייב להיות במקום מדויק זה כדי לעבוד. אם התסריט יועבר אי פעם או שספריה הביתית שלך תשתנה אי פעם, ההצהרה המחייבת תפסיק לעבוד.

במקום נתיבים מוחלטים, לעיתים קרובות מקובל ליצור ./ליב במדריך התוכנית שלך. ה ./ליב הספרייה מתווספת אל $ LOAD_PATH משתנה המאחסן את הספריות בהן הדרישה מחפשת קבצי רובי. לאחר מכן, אם הקובץ my_library.rb מאוחסן בספריית ה- lib, ניתן לטעון אותו לתוכנית שלך בפשטות דורש 'my_library' הצהרה.

הדוגמה הבאה זהה לקודמתה test_program.rb דוגמאות. עם זאת, הוא מניח את test_library.rb הקובץ מאוחסן ./ליב ספרייה ומטען אותה בשיטה שתוארה לעיל.

#! / usr / bin / env אודם
$ LOAD_PATH << './lib'
דורש 'test_library.rb'
t = TestClass.new