4

Coldfusion のドキュメントに基づいて... 「配列は値によってユーザー定義関数に渡されるため、関数は配列データの新しいコピーを取得し、呼び出しページの配列は関数によって変更されません。

だから私は小さな練習プロジェクトに取り組んでいます。まず、数値のリストを取得して配列に変換し (これを cardArray と呼びます)、配列を並べ替え、最後にその配列をいくつかの UDF に渡します。これらの UDF は、数値のさまざまなパターンを検索して操作します (必要に応じて)。 ) 引数 (別名、渡された配列)。

UDF で元の配列を参照することはなく、引数名のみを参照します。それでも...関数を呼び出した後に元の配列を cfdump すると、元の配列が変更されています。誰でも理由を教えてもらえますか?

私はこれを回避できると確信しています。したがって、これを修正することは私の大きな問題ではありません。私の問題は、この動作が、これが機能すると「思っていた」方法と完全に矛盾していることです。

    function hasPair(pairArray) {
        pairCount = 0;
        for (i=2; i lte arrayLen(pairArray); i++){
            if(pairArray[i] is pairArray[i-1]){
                pairCount++
                arrayDeleteAt(pairArray, i)
                arrayDeleteAt(pairArray, i-1)
                i=2
            }
        }
        return pairCount;
    }

    function hasStraight(straightArray){
        sequenceCards = 0;
        for (i=2; i lte arrayLen(straightArray); i++){
            if(straightArray[i] - straightArray[i-1] is 1){
                sequenceCards++
            }
        }
        if (sequenceCards GTE 4){
            return 1;
        }
        else{
            return 0;
        }
    }

</cfscript>

<cfoutput>
    <cfset cardList = "5,6,7,8,10,8,9">
    <cfset cardArray = listToArray(cardList)>
    <cfdump var="#cardArray#" label="Original Array Before">
    <cfset arraySort(cardArray, "numeric", "desc")>
     #hasPair(cardArray)# <br/> 
     #hasStraight(cardArray)# <br/> 
    <cfdump var="#cardArray#" label="Original Array After">
</cfoutput>

結果:

元の配列 BEFORE 関数呼び出し [6,6,7,8,10,8,9]。

元の配列 AFTER 関数呼び出し [10,9,7,6,5]

配列はソートされています (これは正しいと思います)。ただし、8も欠落しています。私はこれを期待していませんでした。8 は、最初の関数の arrayDeleteAt(pairArray, i) および arrayDeleteAt(pairArray, i-1) メソッドによって削除されます。しかし、これは元の配列ではなく、配列引数(pairArray)からのみ要素を削除する必要があります(またはそう思いました)。

4

2 に答える 2

8

ここで Lucee がタグ付けされているので、これを Adob​​e の実装ではなく Lucee で実行していると思います。この場合、Lucee は Adob​​e の仕様に準拠していません。配列は、他のすべての複雑なオブジェクトと同様に参照によって渡されます。

于 2016-03-09T19:51:09.217 に答える