سؤال

وC # وظائف مولد التي لها جملة مثل:

IEnumerable<int> GetNats(int max)
{
   for (int i=0; i < max; ++i)
      yield return i;
}

وهناك سمة أنا مهتم في لغات البرمجة بلدي (أ برمجة مماثلة لجافا، سكالا، أكشن، وC # وجوه المنحى بسيطة) هي تعبيرات المولد. هذه هي أساسا نحوي السكر لوظائف المولد.

وبلدي مرشح مفضل الحالي هو بناء الجملة التالية:

IEnumerable<int> nats = 
  witheach (i in range(0, 42)) 
     yield i * 2; 

ووrange(0, 42) التعبير المدمج في وظيفة المولد.

ولذا سؤالي هو ما جملة تفضل أن ترى تعبيرات مولد، في C # / جافا / سكالا / أكشن نوع اللغة، ولماذا؟

وبعض العوامل التي قد تؤثر على الاستجابات التي مثل سكالا وأكشن، وأعلن أنواع بلغتي بعد نوع. على سبيل المثال:

var myVar : SomeType = initialValue;

وأيضا وظائف مجهولة تبدو مثل هذا:

var myFunc = function(int x) { 
  return x + 1; 
}

وبخلاف ذلك بقية جملة لغتي تشبه جافا أو C #. لغتي لديها بيان foreach التي هي مشابهة جدا لC #.

هل كانت مفيدة؟

المحلول

وهناك أيضا نهج بايثون - لا بناء جملة خاص للمولدات. وجود بيان "العائد" هي كل ما يلزم. أي بيانات التي تأخذ كتلة يمكن أن تستخدم، على الرغم من أنني كنت تتوقع أن تجد الحلقات الوحيدة المستخدمة في الممارسة العملية:

IEnumerable<int> nats = 
    for (i in range(0,42))
        yield i*2

String phrase = "I want to buy some cheese.";
IEnumerable<int> substrs =
    for (i in 0 .. phrase.length)
        for (j in i .. phrase.length+1)
            yield phrase[i..j]

وهنا أفترض لم يتم تضمين نقطة النهاية الصحيحة في النطاق.

لنكون صادقين تماما، عندما رأيت هذا في بيثون، واضطررت الى التساؤل: "بأي ثمن"

نصائح أخرى

وما تحقق من F # لا. يمكنك أن تفعل

seq { seq-expr }    // IEnumerable<T>, a.k.a. seq<T>
[ seq-expr ]        // list<T>
[| seq-expr |]      // array<T>

وحيث يليها-EXPR هو الشكل الذي يشمل معظم بنيات اللغة جنبا إلى جنب مع "العائد". هكذا على سبيل المثال يمكنك كتابة

seq {
    for i in 0..9 do
        for j in someColl do
            if i <> j then
                yield i*j
}

و # مترجم F يترجم هذا الرمز إلى تنفيذ جهاز الدولة من IEnumerable (مثل C # لا للكتل مكرر).

وأنا أحب هذا النحو لأنه يعني على سبيل المثال يمكنك كتابة نفس الرمز المحدد كنت أكتب "ليفعل الاشياء الضروري الآن"، منها مثلا.

    for i in 0..9 do
        for j in someColl do
            if i <> j then
                printfn "%d" i*j

ولكن التفاف هذا الرمز في يليها {} واستخدام "العائد" ويصبح رمز كسول IEnumerable بدلا من ذلك.

IEnumerable nats = 0...42

or for generators 

IEnumerable nats = yield 0...42
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top