Domanda

Quando si utilizza CFML e CF9 solito var ambito mio variabili di loop; in questo caso local.i, ad esempio:

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

Recentemente ho iniziato la conversione di alcune cose in cfscript, e (a mio disappunto ho scoperto che non v'è alcun modo per ciclare su una lista in cfscript) Mi chiedo se dovrei ancora var portata il mio variabili di loop, e in che modo:

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

dovrei fare local.i = 1 e local.i = local.i + 1 istead del codice di esempio nel mio esempio? E 'necessario?

Modifica : Vorrei anche chiedere se la forma cfscript del mio ciclo CFML è corretta; Lo chiedo perché ho appena notato che il mio ciclo CFML utilizza una , (virgola e spazio) per l'argomento delimiter, che sembra non-esistenza nella versione cfscript del ciclo.

È stato utile?

Soluzione

Tutte le funzioni usano ancora la portata delle variabili di default se non si specifica uno, il che renderebbe l'omissione non-thread-safe. Ovunque si dovrebbe avere in precedenza var usato si dovrebbe ora utilizzare local.

Per quanto riguarda il delimitatore virgola + spazio, due cose:

  1. Nel caso in cui non sono a conoscenza, l'argomento della funzione delimitatori lista non è per i delimitatori multi-personaggio, è per più delimitatori; così il vostro elenco sarà diviso per ogni occorrenza di una virgola, così come ogni occorrenza di uno spazio.

  2. È possibile utilizzare lo stesso argomento come parte del vostro listLen e listGetAt metodi, in questo modo:

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

Altri suggerimenti

È sicuramente bisogno di utilizzare l'ambito locale come dice Adam, ma nel caso di loop penso che ci sia una forte necessità di utilizzare il "var" parola chiave, piuttosto che il prefisso "locale" per il bene della leggibilità. Con CF9 non sei più costretto a dichiarazioni posto var nella parte superiore della funzione, quindi tutto quello che dovete fare è aggiungere "var" al tuo "per" condizioni economico per tutte le "i" variabili di diventare thread-safe.

Prendendo in buon punto di Ben di salvare la lunghezza della lista prima di avviare il ciclo, e utilizzando lo stile più conciso i ++ incremento vostro codice sarebbe:

var listLength  =   ListLen( this.list );
for (var i = 1; LTE listLength; i++ ) {
    if (Len(ListGetAt(this.list, i) GT 10)) {
    // do something
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top