Нужно ли варьировать переменные цикла области видимости в CFScript? - PullRequest
7 голосов
/ 06 января 2011

При использовании 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 вместо примера кода в моем примере? Это необходимо?

РЕДАКТИРОВАТЬ : я должен также спросить, правильна ли форма CFScript моего цикла CFML; Я спрашиваю, потому что я только что заметил, что мой цикл CFML использует , (запятая и пробел) для аргумента delimiter, который, кажется, не существует в версии цикла CFScript.

Ответы [ 2 ]

6 голосов
/ 06 января 2011

Все функции по-прежнему используют область видимости переменных по умолчанию, если вы не укажете одну из них, из-за чего ее пропуск не будет безопасен для потоков Где бы вы раньше не использовали var, теперь вы должны использовать local.

Что касается запятой + пробел, две вещи:

  1. Если вы не знаете, аргумент delimiters функции list не для многосимвольных разделителей, а для нескольких разделителей; поэтому ваш список будет разделен для каждого вхождения запятой, а также для каждого вхождения пробела.

  2. Вы используете тот же аргумент, что и часть ваших listLen и listGetAt методов, например:

    for (i = 1; LTE ListLen(this.list, ', '); i = i + 1 ) {
      if (Len(ListGetAt(this.list, i, ', ') GT 10)) {
        // do something
      }
    }
    
5 голосов
/ 17 декабря 2011

Вам определенно нужно использовать локальную область видимости, как говорит Адам, но в случае циклов, я думаю, есть веский аргумент в пользу использования ключевого слова «var», а не префикса «local» для удобства чтения. С CF9 вам больше не нужно размещать объявления var в верхней части функции, поэтому все, что вам нужно сделать, это добавить «var» к вашему условию «for» для всех переменных индекса «i», чтобы стать потокобезопасными.

Принимая во внимание благую точку зрения Бена о сохранении длины списка перед началом цикла и использовании более лаконичного стиля приращения i ++, ваш код будет выглядеть так:

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