currying


السلام عليكم و رحمه الله تعالى و بركاته

قد ذكرت ال currying اكثر من مره هنا و هنا ، ال currying هو ملىء عباره من عبارات وظيفه ما قبل تنفيذها و ارجاع وظيفه جديده ، لكن هل يجب على كل وظيفه انشئها ان ترجع وظيفه جديده حتى اتمكن من عمل currying ؟ بالطبع لا ، يمكنك الزياده على الصنف Function بوظيفه جديده إسمها curry تسهل عليك اى currying كما يوضح المثال البسيط التالى :

function add(a,b){
    alert(a+b);
}

var add5 = add.curry(5); // fill the 1st arguments with 5
add5(3); //8

النتيجه رائعه اليست كذلك ، أفضل من امثله ال currying التى شرحتها من قبل ، لكن كيف يمكننى اضافه هذه الوظيفه curry الى الصنف Function ؟ انظر الى الكود التالى بعنايه شديده و سأشرحه خطوه خطوه :

Function.prototype.curry = function(){
    var fn = this;
    var args = Array.prototype.slice.call(arguments);
    return function(){
        var newArgs = Array.prototype.slice.call(arguments);
        return fn.apply(this,args.concat(newArgs));
    }
}

قمت بإضافه وظيفه جديده بإسم curry لل Function.prototype حتى ترثها كل الوظائف وقت التشغيل :

Function.prototype.curry = function(){...}

قمت بعمل مرجع للوظيفه الحاليه التى تستدعى الوظيفه curry

var fn = this;
//add.curry();

قمت بتحويل العبارت التى تمرر للوظيفه curry من collection ل array و تخزينها فى المتغير args :

var args = Array.prototype.slice.call(arguments);
//var add5 = add.curry(5);

قمت بإرجاع وظيفه جديده – هنا تكمن روح ال currying – فى المثال هذه الوظيفه ستسجل بإسم add5 :

return function(){...}
// var add5 = add.curry(5);

من هنا يبدأ السحر😀 ، عندما يتم استدعاء هذه الوظيفه الجديده فإنها تقوم بعمل مرجع للعبارات التى تمرر لها و تضعها فى المتغير newArgs :

var newArgs = Array.prototype.slice.call(arguments);
// add5(3);

ثم تضم هذه العبارات الجديده newArgs مع العبارات القديمه args فى مصفوفه جديده و تمرر للوظيفه الاصليه add :

return fn.apply(this,args.concat(newArgs));
// add5(3) == add(5,3) == 8

يمكننا عن طريق الوظيفه curry الجديده ملىء العباره الاولى من اى وظيفه ، و توليد وظيفه جديده ، و استخدامها فيما بعد كما توضح الامثله التاليه :

var delayed_alert = setTimeout.curry(function(){alert("working!")});
delayed_alert(2000); // alert after 2 seconds
delayed_alert(8000); // alert after 8 seconds

قمت بملىء العباره الاولى من وظيفه setTimeout بكود لعمل alert و تم توليد وظيفه جديده بإسم delayed_alert يمكننا استخدامها بعد ملىء التوقيت فيها بالطبه يمكنك عمل curry لوظيفه ناتجه من curry اذا كانت عبارات الوظيفه الاصليه اكثر من 2 … الخ

من عيوب ال curry انه لا يمكنك تجاوز ترتيب العبارات فى الوظيفه الاصليه ، بمعنى انه لا يمكنك ملىء العباره الثانيه ، ثم ملىء العباره الاولى .

الأوسمة: ,

6 تعليقات to “currying”

  1. almhajer Says:

    بصراحة هذا الابداع والتميز باعتقادي الفكرة هذه هيا نواة من النواة جاك كيوري فالابداع في الافكار
    بحسب تحليلي لها تقوم بادار عدة ادوار ومنها استعمال الدالة الى عدة استعمالات مثلا الحركة يمكن استخدامها لتقوم بتحريك الكائن يمين ثم بعد الانتهاء تقوم بالعمل يسار وهذا يوفر في الشروط شي غريب عجيب
    ولكن في المثال السابق لم يطبق الكود بشكل صحيح هذا الكود الي استخدمته

  2. almhajer Says:

    Function.prototype.curry = function(){
    var fn = this;
    var args = Array.prototype.slice.call(arguments);
    return function(){
    var newArgs = Array.prototype.slice.call(arguments);
    return fn.apply(this,args.concat(newArgs));
    }
    }

  3. almhajer Says:

    var delayed_alert = setTimeout(function(){alert(“working!”)});
    delayed_alert(2000);
    delayed_alert(8000);

    ينفذ مرة واحدة ولكن الارجاع غير صحيح يتم لايتم ارجاع دالة
    فعند التشغيل للمرة الاخرى يتم التنبيه انه delayed_alert ليس دالة وشكرا جزيلا

  4. mostafa farghaly Says:

    انا غلطت فى مثال setTimeout ، استدعيتها بدون curry ، لكنى عدلتها الان و ستعمل بشكل صحيح ، استدعاء curry هى التى ترجع وظيفه جديده

  5. غير معروف Says:

    بارك الله فيك اخوي انا حاولت استدعيها بعدة طرق على انها مشتقة من الصنف اشتقاق فما نجحت معايا
    الان تمام بارك الله فيك ودمت سالم

  6. mostafa farghaly Says:

    @مهاجر : التعليقات الكثيره المتشابهه وردبريس يعتبرها spam😀 ، انا قرأت كل تعليقاتك و عدلت الموضوع .
    @غيرمعروف : تسرنى متاعتك و الحمد لله انها نجحت معك

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s


%d مدونون معجبون بهذه: