גנרטורים – החלקים החריפים

ג'ף פוזניק
ג'ף פוזניק

מפרט הטיוטה של ECMAScript 6 כבר הביא לתוצאות רבות של שמחה עבור מפתח ה-JavaScript המודרני. בפוסט קודם דיברנו על כמה מחלקות חדשות של אוספים ו-for..of לולאות איטרציה. בפוסט הזה נדבר על משהו שהולך יד ביד עם לולאות for..of: פונקציות מחולל.

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

עכשיו ניכנס לעומק של דוגמת JavaScript שמכסה חלק מהחלקים המסתוריים בעבודה עם גנרטורים. קיימות הערות רבות, ואפשר להתנסות בגרסה הפעילה של הקוד לפני שתקראו אותו:

אם כך, מהן המסקנות העיקריות מהקוד?

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

שנית, אפשר להעביר פרמטר כשקוראים לשיטה next() של איטרטור, והערך הזה יוקצה לכל מה שמופיע בצד ימין של ההצהרה yield מהפעלת האיטרטור הקודמת. זו דרך מצוינת לשנות את הפלט של האיטרטור – כאן אנחנו משתמשים בו כדי לקבוע אם המילה שתיווצר תופיע באות גדולה או לא. אם אתם רוצים להשפיע על הערך הראשון שיתקבל, עשו זאת באמצעות פרמטר בבונה המחולל.

לבסוף, המחוללים יכולים להפיק איטרטורים מוגבלים או איטרטורים אינסופיים. אם אתם עובדים עם איטרטור אינסופי, ודאו שיש לכם תנאי מסוף כלשהו המבוסס על הערך yielded. קל מאוד לכתוב בטעות לולאות אינסופיות, במיוחד כשמשתמשים ב-for..of לאיטרציה. אם עובדים עם איטרטור סופי באמצעות קריאות ל-next(), המאפיין .done של האובייקט שממוחזר מסמן אם האיטרציה הושלמה.

אנחנו מקווים שהדגימה הזו, יחד עם משאבים אחרים שזמינים באינטרנט, יגרמו לכם להתלהב קצת ויגרמו לכם לחשוב איך להשתמש במחוללים בקוד שלכם. גרסאות של Firefox שמתחילות בגרסה 31 ו-Chrome עם 39 מחוללי תמיכה במקור. פרויקט המחולל כולל תמיכה גנרטיבית לדפדפנים אחרים, וניתן גם להשתמש ב-Traceur.

תודה לאריק ארבידסון על העזרה בבדיקת המאמר הזה.