2011-01-06 7 views
7

CFMLとCF9を使用しているときは、通常、ループ変数です。この場合local.iには、例えば:CFScriptのvarスコープループ変数は必要ですか?

<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 = 1local.i = local.i + 1 isteadをやるべきこと:私はまだのvarスコープ私のループ変数、およびどのようにすべき?それは必要ですか?

EDIT:私のCFMLループのCFScript形式が正しいかどうかを尋ねる必要があります。 delimiter引数にCFMLループが,(コンマとスペース)を使用していて、CFScriptバージョンのループに存在しないように見えるため、私は尋ねます。

+1

私は注意します一つのこと:ループを開始する前に、リストの長さを節約し、より簡潔に使用についてベンの良い点で私はあなたのコードは次のようになり、スタイルをインクリメント++取る

あなたのリストの長さを変更することができます、私はそれを変数に格納し、それをループします。私の理解は、あなたがこれを書いた方法で、すべてのループに対してlistlen()オペレーションが呼び出されるということです。 –

答えて

6

すべての関数は、デフォルトで変数スコープを使用しています(指定しない場合は、スレッドセーフではない)。以前はvarを使用していたはずでしたが、localを使用してください。

コンマ+スペース区切り、二つのことについては:あなたが気づいていない場合には

  1. 、リスト機能の区切り文字引数は複数文字の区切り文字のためではない、それは複数の区切り文字です。あなたのリストはカンマの各出現のために分割されるだけでなく、スペースが出現するたびに分割されます。

  2. あなたは、あなたのlistLenlistGetAt方法の一部として同じ引数を使用しそうのように:

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

ありがとう! 「UDFで変数のスコープを使用している」と言うと、その定義にはCFCコンポーネントで宣言した関数が含まれていますか? – Mohamad

+1

いいえ、CFC内のどのメソッドもローカルスコープになります。 –

+2

スコープされていない変数は変数のスコープをデフォルトにしているので、すべてのローカル変数のスコープを確認するには、新しい "local"スコープを使用するか、 "var"キーワードを使用します。 –

5

あなたは間違いなく、アダムが言うようにローカルスコープを使用する必要がありますが、ループの場合、私は読みやすいように "ローカル"プレフィックスではなく、 "var"キーワードを使用することが重要だと思います。 CF9では、関数の先頭にvar宣言を置く必要がなくなりました。すべてのインデックス "i"変数がスレッドセーフになるように、 "for"条件文に "var"を追加するだけで済みます。 - あなたの "ない限り

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