ايه هى yield؟
yield هى عبارة عن keyword بتوفر ليا generator يعنى اقدر استخدمها فى انى اولد نتائج عند الحاجة.
لا مش فاهم!
بص ياسيدى خلينا نفترض ان انا عاوز اجيب الارقام من 1 لحد 100 الف وعاوز اخلى كل رقم يبقى بالشكل دا مثلا Current number is: 1 واطبعها او اعمل بيها اى حاجة تانية .. سامعك وانت بتقولى هستعمل دالة range واجيب الارقام واحط الصيغة والتعديل بتاعى عليها واخزنها فى array واعمل return وابقى استعملها فى اى جزء بعد كدا .. هقولك تمام بس انت عملت حساب الميمورى؟ اكيد لا .. تعالى كدا وشوف معايا وخلينى امشى معاك للاخر لو طبقنا طريقتك ممكن الكارثة تبقى ايه .. شوف كدا معايا:
دا الكود الى بينفذ الفكرة بطريقتك:

الى حصل هنا ان فى دالة generateNumbers
انها جابت ال 100 الف رقم وعملت صيغة معينة وخزنت صيغة الارقام دى كلها فى array .. اه ايه المشكلة مش فاهم .. المشكلة ان انت هنا خزنت قيم وشغلت مساحة فى الميمورى وانت اصلا مش محتاجها يعنى لو شفنا الكود الى تحت الخاص بعملية ال loop هتلاقى انه بيمشى خطوة خطوة عشان يطبع القيم وبما انها بتمشى خطوة خطوة يبقى انا ليه اكون فى رقم 5 مثلا لسه وفى نفس الوقت رقم 99999 متخزن فى الميمورى وشاغل مساحة وانا اصلا لسه موصلتلوش .. يبقى احنا كدا المفروض فهمنا ليه المفروض مستعملش الطريقة دى فى التاسك المطلوب .. وهنا ييجى دور yield والى قولنا عليها فوق انها generator يعنى بتنشأ الرقم عند الحاجة فقط يعنى بالظبط بتعمل lazy loading للقيم وبالتالى استخدامها للميمورى ثابت لانها مش بتخزن القيم فعليا فى الميمورى لكنها بتنشئ القيمة عند الحاجة .. حلو تيجى هنا الخطوة التانية الى هى ازاى استعمل yield عشان تحللى المشكلة دى .. الكود الى جاى دا بيوضح لينا:

وبكدا نبقى استعملنا yield وحافظنا على الميمورى.
تعالى هنا رايح فين تعالى اقولك على عيوبها لان الكمال لله وحده:
- متقدرش تستعمل نفس الدالة اكتر من مرة .. يعنى ايه؟ .. يعنى الكود بتاع ال loop الى تحت لو كررته مش هيطبع حاجة.
- مينفعش تستعملها بشكل مباشر .. يعنى ايه؟ .. يعنى متقدرش تستعملها بالشكل دا ($numbers = generateNumbers();) .. طب لو طبعنا المتغير دا هيحصل ايه .. ببساطة (Generator Object) فقط.
- لو حبيت تعمل عليها عمليات معقدة مش هتقدر .. يعنى مثلا لو حبيت تستعمل array_fiter معاها هيحصل ايه؟ .. ولا اى حاجة هيضرب فى وشك بس ودا لان الدالة دى واخواتها بيشتغلوا مع ال arrays بس مش مع ال Generators
- صعب تعملها Debugging.
طب امتى استخدمها؟
- لو عندك داتا كتير وعاوز تحافظ على الميمورى.
- لو مش هتعدل عليها تعديلات معقدة.
- لو مش عاوز توصلها بشكل مباشر يعنى مثلا تيجى وتقوم عامل كدا (generateNumbers()[7]) .. لا مفيش الكلام دا ودا لاننا قولنا قبل كدا انها بتعمل lazy loading.
وكدا يبقى فمهنا ايه هى yield وامتى استخدمها.
متنساش تعمل متابعة على LinkedIn 🤓