سؤال

عند استخدام CFML و CF9 ، عادةً ما أتخلى عن متغيرات الحلقة الخاصة بي ؛ في هذه الحالة local.i, ، علي سبيل المثال:

<cfloop list="#this.list#" index="local.i">
  <cfif Len(local.i) GT 10>
    // do something
  </cfif>
</cfloop>

لقد بدأت مؤخرًا تحويل بعض الأشياء إلى CFScript ، و (إلى خيبة أملي ، اكتشفت أنه لا توجد طريقة للحلق على قائمة في CFScript) أنا أتساءل عما إذا كان لا يزال يتعين عليّ نطاق متغيرات الحلقة الخاصة بي ، وكيف:

for (i = 1; LTE ListLen(this.list); i = i + 1 ) {
  if (Len(ListGetAt(this.list, i) GT 10)) {
    // do something
  }
}

هل يجب أن أفعل local.i = 1 و local.i = local.i + 1 istead من رمز العينة في مثالي؟ هل من الضروري؟

تعديل: يجب أن أسأل أيضًا ما إذا كان شكل CFScript لحلقة CFML صحيحًا ؛ أسأل لأنني لاحظت للتو أن حلقة CFML الخاصة بي تستخدم ملف , (فاصلة ومساحة) ل delimiter الحجة ، التي تبدو غير موجودة في إصدار CFScript من الحلقة.

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

المحلول

لا تزال جميع الوظائف تستخدم نطاق المتغيرات افتراضيًا إذا لم تحدد واحدة ، مما يجعل حذفها غير آمنة. أينما كنت قد استخدمت سابقًا var يجب أن تستخدم الآن local.

أما بالنسبة لمحدد الفضاء+الفضاء ، شيئان:

  1. في حال لم تكن على دراية ، فإن وسيطة المحددات الخاصة بوظيفة القائمة ليست مخصصة لمحميات المحددات المتعددة ، فهي مخصصة لثباتات متعددة ؛ لذلك سيتم تقسيم قائمتك لكل حدوث فاصلة ، وكذلك كل حدوث مساحة.

  2. يمكنك استخدام نفس الوسيطة كجزء من listLen و listGetAt طرق ، مثل ذلك:

    for (i = 1; LTE ListLen(this.list, ', '); i = i + 1 ) {
      if (Len(ListGetAt(this.list, i, ', ') GT 10)) {
        // do something
      }
    }
    

نصائح أخرى

أنت بالتأكيد بحاجة إلى استخدام النطاق المحلي كما يقول آدم ، لكن في حالة الحلقات ، أعتقد أن هناك حالة قوية لاستخدام الكلمة الرئيسية "VAR" بدلاً من البادئة "المحلية" من أجل قابلية القراءة. مع CF9 ، لم تعد مضطرًا إلى وضع إعلانات VAR في الجزء العلوي من الوظيفة ، لذلك كل ما تحتاجه هو إضافة "var" إلى "بيان الشرط الخاص بك" لجميع متغيرات الفهرس "I" لتصبح مؤشر ترابط آمن.

أخذ نقطة بن جيدة حول حفظ طول القائمة قبل بدء الحلقة ، واستخدام نمط زيادة I ++ الأكثر إيجازا سيكون رمزك هو:

var listLength  =   ListLen( this.list );
for (var i = 1; LTE listLength; i++ ) {
    if (Len(ListGetAt(this.list, i) GT 10)) {
    // do something
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top