2011-01-06 16 views
7

Podczas korzystania z CFML i CF9 zwykle zmienię zakres moich zmiennych pętli; w tym przypadku local.i, na przykład:Czy konieczne jest zmienne zmienne pętli zakresu w CFScript?

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

Niedawno rozpoczął przekształcanie kilka rzeczy do CFScript oraz (ku mojemu rozczarowaniu okazało się, że nie ma sposobu na pętli na liście w CFScript) Zastanawiam się, czy powinienem jeszcze var zakres moje zmienne pętlowe i jak:

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

powinienem robić local.i = 1 i local.i = local.i + 1 istead kodu próbki w moim przykładzie? Czy to konieczne?

EDIT: Powinienem również zapytać, czy forma CFScript mojej pętli CFML jest poprawna; Pytam, ponieważ właśnie zauważyłem, że moja pętla CFML używa , (przecinek i spacja) dla argumentu delimiter, który wydaje się nieistniejący w wersji CFScript pętli.

+1

Jedną rzecz chciałbym zwrócić uwagę - chyba że " zrób coś "może zmienić długość twojej listy, chciałbym zapisać ją w zmiennej i zapętlić do tego. Rozumiem, że sposób w jaki to napisałeś, operacja listlen() będzie wywoływana dla każdej pętli. –

Odpowiedz

6

Wszystkie funkcje nadal korzystają z zakresu zmiennych domyślnie, jeśli nie zostanie podany, co spowoduje pominięcie go bez wątku. Gdziekolwiek wcześniej powinieneś używać var powinieneś teraz użyć local.

chodzi o przecinek + spacja separatora, dwie rzeczy:

  1. W przypadku, gdy nie są świadomi, ograniczniki argument funkcji lista nie jest dla ograniczników multi-znakowych, to dla wielu ograniczników; więc twoja lista zostanie podzielona na każde wystąpienie przecinka, a także każde wystąpienie spacji.

  2. użyć tego samego argumentu jako część listLen i listGetAt metodami, tak jak poniżej:

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

dzięki! Dla jasności, kiedy mówisz "UDF wciąż używają zakresu zmiennych" - czy ta definicja obejmuje dowolne funkcje, które sam zadeklarowałem w moim komponencie CFC? – Mohamad

+1

Nie, żadna metoda wewnątrz CFC będzie domyślna dla zakresu lokalnego. UDF, o których mówiłem, byłyby gdziekolwiek indziej (np. Niestandardowy znacznik, szablon cfm itp.). –

+2

Zmienne nieprzesłane są domyślne do zakresu zmiennych, więc należy upewnić się, że zakres wszystkich zmiennych lokalnych jest zmieniony przy użyciu nowego "lokalnego". "zakres lub użycie słowa kluczowego" var ". –

5

pewno trzeba korzystać z zakresu lokalnej jak mówi Adam, ale w przypadku pętli Sądzę, że istnieje silne uzasadnienie użycia słowa kluczowego "var" zamiast "lokalnego" w celu zapewnienia czytelności. CF9 nie jest już zmuszane do umieszczania deklaracji var na górze tej funkcji, więc wystarczy dodać "var" do warunku "for" dla wszystkich zmiennych "i" indeksu, aby stały się bezpieczne dla wątków.

Biorąc w dobrym punkcie Bena o zapisaniu długość listy przed rozpoczęciem pętli, a przy użyciu bardziej zwięzły i ++ przyrost styl kod byłoby:

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