سؤال

لدي بعض أكواد Java التي تستخدم الأقواس المتعرجة بطريقتين

// Curly braces attached to an 'if' statement:
if(node.getId() != null)
{
    node.getId().apply(this);
}

// Curly braces by themselves:
{
    List<PExp> copy = new ArrayList<PExp>(node.getArgs());
    for(PExp e : copy)
    {
        e.apply(this);
    }
}
outAMethodExp(node);

ماذا تفعل تلك الأقواس المتعرجة المستقلة بعد الأولى if بيان يعني؟

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

المحلول

والغرض الوحيد من الأقواس إضافية هو توفير نطاق الحد. سوف List<PExp> copy وجود لها إلا في تلك الأقواس، وسوف يكون له نطاق خارج منها.

وإذا كانت هذه هي إنشاء التعليمات البرمجية، وأفترض-مولد رمز يفعل هذا حتى أنه يمكن إدراج بعض التعليمات البرمجية (مثل هذا) دون الحاجة إلى القلق بشأن عدد المرات التي إدراجها في List<PExp> copy ودون الحاجة إلى القلق حول إمكانية إعادة تسمية المتغيرات إذا تم إدراج هذا المقتطف إلى نفس الأسلوب أكثر من مرة.

نصائح أخرى

وI الثانية ما كتبه مات ب، وسأضيف أن استخدام آخر رأيت من الأقواس مجهول هو الإعلان عن منشئ الضمني في فصول مجهولة. على سبيل المثال:

  List<String> names = new ArrayList<String>() {
    // I want to initialize this ArrayList instace in-line,
    // but I can't define a constructor for an anonymous class:
      {
        add("Adam");
        add("Eve");
      }

  };
وقد اتخذت

وبعض الأطر اختبار وحدة بناء الجملة هذا إلى مستوى آخر، والتي لا تسمح بعض الأشياء التي تبدو بقعة uncompilable تماما للعمل. لأنها <م> نظرة غير مألوف، وأنا لست مثل مروحة كبيرة بنفسي، ولكن يجدر بنا أن ما لا يقل عن التعرف على ما يجري إذا قمت بتشغيل عبر هذا الاستخدام.

وأنا أتفق مع الحد الجواب نطاق، ولكن أن أضيف شيئا واحدا.

وأحيانا تشاهد بناء من هذا القبيل في القانون من الناس الذين يحبون لأضعاف مقاطع التعليمات البرمجية ويكون رؤساء التحرير التي من شأنها اضعاف الأقواس تلقائيا. التي يستخدمونها لطيها مدوناتها في أقسام المنطقية التي لا تقع في وظيفة، والطبقة، حلقة، وما إلى ذلك من شأنه أن عادة أن تكون مطوية.

وكنت في الواقع أعتقد أن أحدا نسي بيان آخر.

وهناك نادرا ما سبب وجيه لعناء حتى مع إنشاء نطاقات كتلة إضافية. وفي هذا الصدد، ومعظم الحالات، فإنه على الأرجح حتى شخص قد نسوا لكتابة بيان سيطرتهم مما هو عليه أنهم كانوا يفعلون شيئا ذكيا.

وأنها تجعل على نطاق الداخلي. متغير أعلن داخل هذه الأقواس غير مرئية خارج منها. هذا ينطبق أيضا على C / C ++.

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

switch(foo) {
  case BAR:
     int i = ...
     ...
  case BAZ:
     int i = ... // error, "i" already defined in scope
}

ولكن يمكنك كتابة

switch(foo) {
  case BAR:{
     int i = ...
     ...
  }
  case BAZ:{
     int i = ... // OK
  }
}

ويستخدم أيضا ل .

وأنها تحدد نطاق جديد وهو ما يعني أن كل شيء أعلن في هذا المجال غير مرئي خارج الأقواس المعقوفة.

وأما مذكرة مثيرة للاهتمام: الأقواس في الواقع تمكين فئة من البيانات: الإعلانات

وهذا غير قانوني: if(a) int f;

ولكن هذا هو قانوني: if(a) { int f; }

وأعتقد أنها مجرد تحديد مستوى لم يكشف عن اسمه النطاق.

جلب نطاق، ينسخ لن يكون مرئيًا خارجه، لذا يمكنك الإعلان عن متغير آخر بنفس الاسم لاحقًا.ويمكن لمجمع البيانات المهملة جمعها مباشرة بعد الخروج من هذا النطاق.في هذه الحالة ينسخ بمثابة متغير مؤقت، لذلك فهو مثال جيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top