اذا لم تجد ما تبحث عنه يمكنك استخدام كلمات أكثر دقة.
تسمح العديد من لغات البرمجة المهيكلة للكتل ، وليس كلها ، بتقييد النطاق على كتلة ، والتي تعرف باسم نطاق الكتلة. بدأ هذا بـ ALGOL 60 ، حيث "[...] الإعلان ... صحيح فقط لهذه الكتلة." ، واليوم يرتبط بشكل خاص باللغات في عائلة باسكال وجيم وتقاليدها. غالباً ما يتم احتواء هذه الكتلة داخل دالة ، وبالتالي تقييد النطاق إلى جزء من الدالة ، ولكن في بعض الحالات ، مثل Perl ، قد لا تكون الكتلة داخل دالة.
unsigned int sum_of_squares(const unsigned int N) { unsigned int ret = 0; for (unsigned int n = 1; n <= N; n++) { const unsigned int n_squared = n * n; ret += n_squared; } return ret; }
المثال المعتمد لاستخدام نطاق المنع هو الكود C الموضح هنا ، حيث يتم تحديد نطاق متغيرين للحلقة: المتغير n، الذي تتم تهيئته مرة واحدة ويزداد في كل تكرار للحلقة ، والمتغير المساعد n_squared ، والذي تتم التهيئة في كل تكرار. والغرض من ذلك هو تجنب إضافة متغيرات إلى نطاق الدوال ذي الصلة فقط بكتلة معينة - على سبيل المثال ، يمنع الأخطاء حيث تم بالفعل تعيين متغير الحلقة العامة الذي قمت بطريق الخطأ إلى قيمة أخرى. في هذا المثال ، لن يتم تعيين تعبير n * nبشكل عام لمتغير مساعد ، وببساطة يكون نص الحلقة مكتوبًا ret += n * n ولكن في الأمثلة الأكثر تعقيدًا تكون المتغيرات المساعدة مفيدة.
تستخدم الكتل في المقام الأول لتدفق التحكم ، كما هو الحال في حالة ، بينما ، وللحلقة ، وفي هذه الحالات ، فإن نطاق الكتلة يعني أن نطاق المتغير يعتمد على بنية تدفق تنفيذ الدالة. ومع ذلك ، فإن اللغات ذات نطاق الكتل تسمح عادةً باستخدام الكتل "المجردة" ، التي يكون غرضها الوحيد هو السماح بالتحكم الدقيق في النطاق المتغير. على سبيل المثال ، يمكن تعريف المتغير الإضافي في كتلة ، ثم استخدامه (على سبيل المثال ، إضافة إلى متغير مع نطاق الوظيفة) والتخلص منه عند انتهاء الكتلة ، أو قد تكون حلقة أثناء محاطة بكتلة تقوم بتهيئة المتغيرات المستخدمة داخل الحلقة يجب أن يتم تهيئتها مرة واحدة فقط.
إن دقة العديد من لغات البرمجة ، مثل Algol 68 و C (كما هو موضح في هذا المثال والموحدة القياسية منذ C99) ، هي أنه يمكن الإعلان عن متغيرات نطاق الكتلة ليس فقط داخل جسم الكتلة بل أيضًا ضمن بيان التحكم ، إذا أي. ويماثل ذلك مع معلمات الدالة ، التي يتم تعريفها في تعريف الدالة (قبل بدء تشغيل كتلة الدالة) ، وفي نطاق جسم الوظيفة بالكامل. يُستخدم هذا بشكل أساسي في الحلقات ، التي تحتوي على عبارة التهيئة منفصلة عن حالة الحلقة ، على عكس الحلقات ، وهي لغة شائعة.
يمكن استخدام نطاق الحظر للتظليل. في هذا المثال ، داخل الكتلة ، يمكن أيضًا تسمية المتغير المساعد n ، وتظليل اسم المعلمة ، ولكن هذا يعتبر أسلوبًا سيئًا نظرًا لاحتمالية حدوث أخطاء. علاوة على ذلك ، بعض المتحدرين من C ، مثل Java و C # ، على الرغم من وجود دعم لنطاق الكتلة (حيث يمكن جعل متغير محلي يخرج من النطاق قبل نهاية الدالة) ، لا تسمح لمتغير محلي واحد بإخفاء آخر . في مثل هذه اللغات ، قد يؤدي محاولة إعلان n الثاني إلى حدوث خطأ في بناء الجملة ، وسيتعين إعادة تسمية أحد المتغيرات n.
إذا تم استخدام قالب لتعيين قيمة متغير ، يتطلب نطاق الكتلة أن يتم الإعلان عن المتغير خارج الكتلة. هذا يعقد استخدام البيانات الشرطية مع مهمة واحدة. على سبيل المثال ، في بايثون ، التي لا تستخدم نطاق الحظر ، يمكن للمرء أن يهيئ المتغير على هذا النحو:
if c: a = 'foo' else: a = ''
حيث يمكن الوصول إليها بعد العبارة if.
في Perl ، الذي يحتوي على نطاق الحظر ، يتطلب ذلك بدلاً من ذلك تحديد المتغير قبل الكتلة:
my $a; if (c) { $a = 'foo'; } else { $a = ''; }
غالبًا ما يتم إعادة الكتابة بدلاً من ذلك باستخدام تعيين متعدد ، مع تهيئة المتغير إلى قيمة افتراضية. في بايثون (حيث لا يكون ضروريًا) على هذا النحو:
a = '' if c: a = 'foo'
بينما في Perl سيكون هكذا:
my $a = ''; if (c) { $a = 'foo'; }
في حالة تخصيص متغير واحد ، يكون البديل هو استخدام المشغل الثلاثي لتجنب كتلة ، ولكن هذا ليس ممكنًا بشكل عام لتخصيصات متعددة ومتغيرة ، ويصعب قراءته بالنسبة للمنطق المعقّد.
هذه مشكلة أكثر أهمية في C ، خاصةً لتخصيص السلسلة ، حيث يمكن أن تقوم تهيئة السلسلة تلقائيًا بتخصيص الذاكرة ، بينما يتطلب تعيين سلسلة إلى متغير تم تهيئته بالفعل تخصيص الذاكرة ونسخة سلسلة والتحقق من نجاحها.
sub increment_counter () { my $counter = 0; return sub () { return ++$counter; } }
تسمح بعض اللغات بمفهوم نطاق الكتلة ليتم تطبيقه ، بدرجات متفاوتة ، خارج الدالة. على سبيل المثال ، في مقطع Perl على اليمين ، $ counter هو اسم متغير بنطاق كتلة (بسبب استخدام الكلمة الرئيسية الخاصة بي) ، بينما increment_counter هو اسم دالة بنطاق عالمي. ستزيد كل مكالمة إلى increment_counter من قيمة العداد بالدولار الواحد وتعيد القيمة الجديدة. يمكن أن يؤدي الرمز خارج هذا الحظر إلى الاتصال بـ increment_counter ، ولكن لا يمكنه الحصول على قيمة العداد بالدولار أو تغييره. هذا المصطلح يسمح للمرء بتعريف الإغلاق في perl.