אני הולך ליצור כאן פרקים קצרים של מה שאני מבין מרובי בשביל שיהיה לי דבר ראשון תעוד לזה, אבל גם אתם תוכלו להעזר בידע. הידע שאני שופך כאן אינו מסודר לפי סדר מסויים, אלא לפי נושא שנתקלתי בו ושאני לפחות חושב שהבנתי.
כל "חלק" יתן קישור גם לחלק הקודם.
הבנה של yield ובלוקים
ברובי הרבה מהעבודה מתבצעת באמצעות בלוקים (עד כאן ידעתי והכרתי גם לפני). כאשר אנחנו מעבירים בפונקציה פרמטר באמצעות בלוקים, אנחנו משתמשים בעצם בפרמטר שהועבר ב yield . השם כמובן אינו משנה, כי הוא מקבל את התוכן של הפרמטר ב yield, אבל נהוג לספק את אותו השם בדיוק.
התפקיד של yield הוא לעצור ריצה בנקודה שהוא הוגדר, ולספק את הערך של הפרמטר שמוגדר ב yield (זה גם יכול להיות עוד פונקציה עד כמה שאני יודע), והערך מתקבל ברגע שקוראים לו עם המתודה שהגדירה אותו, ואז הוא ימשיך הלאה. תמיד חשבתי שהבנתי את yield, אבל אחרי קריאה מחודשת עם דוגמאות, אני חייב להגיד שלא באמת הבנתי.
השימוש ב yield נראה כך:
def explain_yield
arr = [1, 2, 3, 4]
arr.each do |i|
yield i
end
end
הפונקציה למעלה תיתן לנו להשתמש בתוכן של i מבחוץ כל פעם שנשתמש בפונקציה explain_yield עם בלוקים. כלומר:
explain_yield { |i| puts i }תדפיס עבורינו את הערך ש i העומד כרגע בריצה של הלולאה.
דרך לקבל את כל הערכים היא:
explain_yield do |i|
puts i
endואנחנו נקבל הדפס של כל הערכים ש i מקבל בריצת הלולאה. למעשה ה do יוצר לנו את הלולאה במקרה הזה.


23 אפריל, 2009 בשעה 3:17 pm
זה נראה מאוד כמו callback בjavascript:
function explain_yield(yield){
for(var i=1;i<5;i++){
yield(i);
};
};
explain_yield(function(i){
alert(i);
});
23 אפריל, 2009 בשעה 5:16 pm
זה ממש לא כמו callback. זו דרך לבצע איטרציה על שדות בלי לשכפל את הקוד שעושה את האיטרציה עצמה.