سؤال

إذا كان لدي لغة برمجة ذات وظائف من الدرجة الأولى.ما هي الدلالات التي يجب أن تكون عند مشاركة وظيفة المولد؟

على سبيل المثال:

var f = function() { 
  foreach (i in 0..42)
     yield i;
}

int a = f(); // 0
int b = f(); // 1

// Assigning the generator function 
var g = f;

int c = g(); // ??
int d = f(); // ??

أستطيع أن أتخيل ثلاثة أشياء:

  1. c == 2, d == 3 مما يعني أن وظيفة المولد مشتركة
  2. c == 0, d == 2 مما يعني أنه تم إنشاء دالة مولد جديدة، مع تهيئة القيم
  3. c == 2, d == 2 مما يعني أنه يتم إنشاء وظيفة مولد جديدة عن طريق نسخ الحالة الحالية للمولد

أفضل إجابة في رأيي هي تقديم الحجة الأكثر إقناعًا للقيام بآلية أو أخرى.كثيرًا ما أجد أن حالة التقنية الصناعية السابقة هي الحجة الأكثر إقناعًا.

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

المحلول

إذا كان لديك دلالات مرجعية في لغتك، وعادة ما تكون المهمة هي مهمة مرجعية، فأنت تريد الخيار 1.

وهذا ما يحدث في بايثون، حيث يُنشئ نكون الكائنات، والمهمة يكون تعيين المرجع (على الرغم من أنك تستدعي .next() لاسترداد القيمة التالية، بدلاً من "استدعاء" المولد).

فيما يلي عرض توضيحي موجز لكيفية تصرف هذا في بايثون:

>>> def gen():
...   for i in range(42):
...     yield i
... 
>>> f = gen().next
>>> a = f()
>>> b = f()
>>> g = f
>>> c = g()
>>> d = f()
>>> a, b, c, d
(0, 1, 2, 3)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top