Pregunta

Al usar CFML y CF9 lo general var alcance mis variables de bucle; en este caso local.i, por ejemplo:

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

Hace poco comenzó la conversión de algunas cosas en CFScript, y (para mi decepción descubrí que no hay manera de iterar sobre una lista de CFScript) Me pregunto si debería aún un margen var mi variables de bucle, y cómo:

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

debería hacer local.i = 1 y Istead local.i = local.i + 1 del código de ejemplo en mi ejemplo? ¿Es necesario?

Editar : También debe preguntar si la forma CFScript de mi bucle CFML es correcta; Lo pregunto porque me he dado cuenta de que mi bucle CFML utiliza un , (coma y espacio) para el argumento delimiter, que parece no existencia en la versión CFScript del bucle.

¿Fue útil?

Solución

Todas las funciones todavía utilizan el alcance de variables por defecto si no se especifica uno, lo que haría que la omisión de no-thread-safe. Donde quiera que con anterioridad se hubiera usado var ahora debería utilizar local.

Como para el delimitador de coma + espacio, dos cosas:

  1. En caso de que no saben, el argumento de la función delimitadores lista no es para delimitadores de caracteres múltiples, es para múltiples delimitadores; por lo que su lista será dividida para cada ocurrencia de una coma, así como cada vez que aparezca un espacio.

  2. Se utiliza el mismo argumento como parte de sus listLen y listGetAt métodos, así:

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

Otros consejos

Es imprescindible disponer de usar el ámbito local como dice Adam, pero en el caso de bucles creo que hay un fuerte argumento para el uso de la "var" palabra clave en lugar del prefijo "local" en aras de la legibilidad. Con CF9 ya no está obligado a declaraciones lugar var en la parte superior de la función, por lo que todo lo que necesita hacer es añadir "var" a su "por" declaración de estado de todo el índice "i" variables para convierto segura hilo.

Teniendo en buen punto de Ben sobre el ahorro de la longitud de la lista antes de iniciar el bucle, y con el estilo más concisa i ++ incremento de su código sería:

var listLength  =   ListLen( this.list );
for (var i = 1; LTE listLength; i++ ) {
    if (Len(ListGetAt(this.list, i) GT 10)) {
    // do something
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top