רובי מגיע מצויד בכלי חזק וגמיש לניתוח אפשרויות שורת הפקודה, OptionParser. לאחר שתלמד כיצד להשתמש בזה, לעולם לא תחזור לחפש ידנית באמצעות ARGV. ל- OptionParser מספר תכונות שהופכות אותו למושך למדי למתכנתי רובי. אם אי פעם ניתוחם אפשרויות ביד עם Ruby או C, או עם ה- getoptlong פונקציה C, תוכלו לראות כמה מבורכים חלק מהשינויים הללו.
- OptionParser הוא יבש. אתה צריך רק לכתוב את מתג שורת הפקודה, את הטיעונים שלה, את הקוד להפעלת כאשר הוא נתקל, ואת תיאור מתג שורת הפקודה פעם אחת בסקריפט שלך. OptionParser תפיק עבורך אוטומטית מסכי עזרה מהתיאור הזה, וכן תסיק את כל הוויכוחים מהתיאור מתיאורו. לדוגמה, הוא יידע את - קובץ [קובץ] אפשרות היא אופציונלית ולוקחת טיעון יחיד. כמו כן, זה יידע את זה - [- אין] ורבוז זו באמת שתי אפשרויות ותקבל את שתי הצורות.
- OptionParser ימיר אוטומטית אפשרויות למחלקה ספציפית. אם האפשרות לוקחת מספר שלם, היא יכולה להמיר כל מחרוזת המועברת בשורת הפקודה למספר שלם. זה מקצץ בכמה מהטידיום הכרוך בניתוח אפשרויות שורת הפקודה.
- הכל מאוד מכיל. כל האופציות נמצאות באותו מקום, וההשפעה של האופציה היא ממש בצד ההגדרה לאופציה. אם יש להוסיף אפשרויות, לשנות או שמישהו פשוט רוצה לראות מה הם עושים, יש רק מקום אחד לחפש. לאחר ניתוח שורת הפקודה, Hash או OpenStruct יחזיקו בתוצאות.
די כבר, תראו לי קוד
אז הנה דוגמא פשוטה לשימוש OptionParser. זה לא משתמש באף אחד מהתכונות המתקדמות, אלא רק בסיסים. ישנן שלוש אפשרויות, ואחת מהן לוקחת פרמטר. כל האפשרויות הינן חובה. יש את -v / - מילולית ו -ש / - מהיר אפשרויות, כמו גם קובץ קובץ logfile אפשרות. בנוסף, התסריט מציג רשימת קבצים ללא תלות באפשרויות.
#! / usr / bin / env אודם
# סקריפט אשר יעמיד פנים שיש לשנות גודל של מספר תמונות
דורש 'optparse'
# חשיש זה יכיל את כל האפשרויות
# מנותח משורת הפקודה על ידי
# OptionParser.
אפשרויות = {}
optparse = OptionParser.new do | opts |
# בחר באנר, המוצג בחלקו העליון
# של מסך העזרה.
opts.banner = "שימוש: optparse1.rb [אפשרויות] קובץ 1 קובץ 2 ..."
# הגדר את האפשרויות, ומה הם עושים
אפשרויות [: verbose] = שקר
opts.on ('-v', '--verbose', 'פלט מידע נוסף') כן
אפשרויות [: מילולית] = נכון
סוף
אפשרויות [: מהיר] = שקר
opts.on ('-q', '- quick', 'לבצע את המשימה במהירות') לעשות
אפשרויות [: מהיר] = נכון
סוף
אפשרויות [: logfile] = אפסי
opts.on ('-l', '- logfile FILE', 'כתוב יומן ל- FILE') לעשות | קובץ |
אפשרויות [: logfile] = קובץ
סוף
# זה מציג את מסך העזרה, כל התוכניות הן
# הניח שיש אפשרות זו.
opts.on ('-h', '- help', 'הצגת מסך זה') לעשות
מכניס בקשות
יציאה
סוף
סוף
# ניתוח את שורת הפקודה. זכור שיש שתי צורות
# של שיטת הניתוח. שיטת הניתוח פשוט מנתחת
# ARGV, בעוד ה"ניתוח! " השיטה מנתחת ARGV ומסירה
# כל האפשרויות שנמצאו שם, כמו גם כל הפרמטרים עבור
# האפשרויות. מה שנותר הוא רשימת הקבצים לשינוי גודל.
optparse.parse!
מגדיר "להיות מילולי" אם אפשרויות [: מילולית]
מכניס "להיות מהיר" אם אפשרויות [: מהיר]
מכניס "רישום לקובץ # {אפשרויות [: logfile]}" אם אפשרויות [: logfile]
ARGV.each do | f |
מכניס "שינוי גודל תמונה מספר {f} ..."
שינה 0.5
סוף
בחינת הקוד
ראשית, ה- optparse ספריה נדרשת. זכור, זה לא פנינה. זה מגיע עם רובי, כך שאין צורך להתקין פנינה או לדרוש אודם לפני optparse.
ישנם שני אובייקטים מעניינים בתסריט זה. הראשון הוא אפשרויות, הוכרז בפסגה העליונה ביותר. זה ריק פשוט חשיש. כאשר מוגדרים אפשרויות, הם כותבים את ערכי ברירת המחדל שלהם לחשיש זה. לדוגמה, התנהגות ברירת המחדל היא של סקריפט זה לא להיות מילולית, כך אפשרויות [: מילולית] מוגדר כ- false. כאשר נתקלות באפשרויות בשורת הפקודה, הן ישנו את הערכים ב- אפשרויות כדי לשקף את השפעתם. לדוגמא, מתי -v / - מילולית נתקל, זה יקצה נכון ל אפשרויות [: מילולית].
האובייקט המעניין השני הוא optparse. זה OptionParser האובייקט עצמו. כשאתה בונה אובייקט זה אתה מעביר אותו כבלוק. חסימה זו מופעלת במהלך הבנייה ותבנה רשימת אפשרויות במבני נתונים פנימיים ותתכונן לנתח הכל. בלוק הזה כל הקסם קורה. אתה מגדיר את כל האפשרויות כאן.
הגדרת אפשרויות
כל אפשרות פועלת לפי אותה דפוס. תחילה אתה כותב את ערך ברירת המחדל אל ה- hash. זה יקרה ברגע OptionParser בנוי. בשלב הבא אתה קורא ל- בשיטה, המגדיר את האפשרות עצמה. ישנן כמה צורות של שיטה זו, אך רק אחת משמשת כאן. הטפסים האחרים מאפשרים לך להגדיר המרות מסוג אוטומטי וערכי ערכים שאופציה מוגבלת אליהם. שלושת הטיעונים הנהוגים כאן הם הטופס הקצר, הטופס הארוך ותיאור האפשרות.
ה ב השיטה תסיק מספר דברים מהטופס הארוך. דבר אחד הוא להסיק הוא הנוכחות של כל פרמטרים. אם קיימים פרמטרים כלשהם באופציה, זה יעביר אותם כפרמטרים לחסימה.
אם קיימת אפשרות בשורת הפקודה, החסימה הועברה ל- ב השיטה מנוהלת. כאן, הבלוקים לא עושים הרבה, הם רק קובעים ערכים בחשיש האפשרויות. אפשר לעשות יותר דברים, כמו לבדוק שקובץ שהתייחס אליו קיים וכו '. אם יש שגיאות, ניתן לזרוק חריגים מהבלוקים האלה.
לבסוף, שורת הפקודה מנותחת. זה קורה על ידי קריאה ל- לנתח! שיטה על OptionParser חפץ. יש למעשה שתי צורות של שיטה זו, לנתח ו לנתח!. כפי שמשתמע מהגרסה עם סימן הקריאה, היא הרסנית. לא זו בלבד שהיא מנתקת את שורת הפקודה, אלא שהיא תסיר את כל האפשרויות שנמצאו מהן ARGV. זה דבר חשוב, הוא יותיר רק את רשימת הקבצים המסופקים לאחר האפשרויות ב ARGV.