חזור שנית

בשפת רובי יש 2 דרכים לחזור על פעולות, אחת כאשר רוצים להתחיל בלוק מההתחלה לגמרי, כלומר לולאה שתתחיל מההתחלה והשנייה כאשר רוצים לחזור על אותו המצב בדיוק, כלומר אותו ערך באיטרציה למשל.

אז איך אנחנו חוזרים על פעולה בתוך בלוק מסוייםב אותו המצב בו אנחנו נמצאים ?

#!/usr/bin/env ruby

companies = %w(Microsoft Apple HP DELL RedHat Mandriva)

companies.each do |name|
 print "Do you like the company #{name} (y/n) ? "
 yn = gets.chop
 unless yn.upcase =~ /^[ynYN]$/
   puts 'Please answer y or n.'
   redo # Here is the secret !!!
 end
end

המילה השמורה redo אומרת לרובי לחזור שוב פעם על הבלוק באיטרטור הנוכחי.

הפלט  שנקבל הוא כזה:

Do you like the company Microsoft (y/n) ? n
Do you like the company Apple (y/n) ? N
Do you like the company HP (y/n) ? n
Do you like the company DELL (y/n) ? y
Do you like the company RedHat (y/n) ?
Please answer y or n.
Do you like the company RedHat (y/n) ?
Please answer y or n.
Do you like the company RedHat (y/n) ?
Please answer y or n.
Do you like the company RedHat (y/n) ? n
Do you like the company Mandriva (y/n) ? Y

ובשביל להתחיל ממש מההתחלה, הקוד צריך להראות ככה:

#!/usr/bin/env ruby

companies = %w(Microsoft Apple HP DELL RedHat Mandriva)

companies.each do |name|
 print "Do you like the company #{name} (y/n) ? "
 yn = gets.chop
 unless yn.upcase =~ /^[ynYN]$/
   puts 'Please answer y or n.'
   retry # Here is the secret !!!
 end
end

כאן השתמשנו במילה השמורה retry אשר מאפסת לנו את האיטרטור וגורמת לנו להתחיל ממש מההתחלה.

הפלט של הקוד הוא:

Do you like the company Microsoft (y/n) ? n
Do you like the company Apple (y/n) ? N
Do you like the company HP (y/n) ? n
Do you like the company DELL (y/n) ? y
Do you like the company RedHat (y/n) ?
Please answer y or n.
Do you like the company Microsoft (y/n) ? n
Do you like the company Apple (y/n) ? n
Do you like the company HP (y/n) ? n
Do you like the company DELL (y/n) ? Y
Do you like the company RedHat (y/n) ? y
Do you like the company Mandriva (y/n) ? y

מתי להשתמש ב retry ומתי ב redo אתם בטח שואלים. אז זה תלוי בצרכים שלכם. תמצאו מידי פעם שימוש ב retry כאשר יש חריגות אחרי שהיה ניסיון לתקן את הבעיה והיה צורך להתחיל מחדש את ביצוע הבלוק.

כאשר אבל יש צורך לחזור רק על הפעולה האחרונה שבוצעה, אז השימוש ב redo נכנס לפעולה.

זה בעצם טיפ לעצמי שאזכור, אבל אני מקווה שזה עוזר גם לכם.

מחשבה אחת על “חזור שנית

  1. פינגבק: בעיות בהתנהגות החריגות (חלק רביעי) | לראות שונה

להשאיר תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s