arrays - मेरी मूल सरणी क्यों बदल रही है?




coldfusion user-defined-functions (2)

चूंकि आपने लूसी को यहां टैग किया है, मैं मान रहा हूँ कि आप इसे लुसी पर चल रहे हैं और Adobe के कार्यान्वयन के लिए नहीं। लुसे इस मामले में एडोब स्पेक के अनुरूप नहीं है; arrays संदर्भ द्वारा सभी अन्य जटिल वस्तुओं की तरह पारित कर रहे हैं।

कोल्डफ्यूज़न प्रलेखन के आधार पर ... " एरे उपयोगकर्ता द्वारा निर्धारित कार्य के लिए मूल्य से पारित किए जाते हैं, इसलिए फ़ंक्शन को एरे डेटा की एक नई प्रति प्राप्त होती है, और कॉलिंग पृष्ठ में एरे फ़ंक्शन द्वारा अपरिवर्तित नहीं होता है। "

इसलिए मैं थोड़ा अभ्यास प्रोजेक्ट पर काम कर रहा हूं। मैं संख्याओं की एक सूची लेकर, एक सरणी में परिवर्तित कर रहा हूं (जिसे मैं कार्डअरेए कहता हूं), फिर सरणी को व्यवस्थित कर रहा हूं, और अंत में कुछ यूडीएफ को सरणी से गुजरता है जो संख्याओं के विभिन्न पैटर्नों को देखेंगे, और हेरफेर करें (यदि आवश्यक हो ) तर्क (उर्फ पारित सरणी)

मैं यूडीएफ में मूल सरणी का संदर्भ नहीं देता, मैं केवल तर्क नाम का संदर्भ देता हूं। फिर भी ... अगर मैं कार्यों को कॉल करने के बाद मूल सरणी को सीएफडीम्प करता हूं, तो मेरे मूल सरणी को बदल दिया गया है। क्या कोई मुझे बता सकता है क्यों?

मुझे पूरा यकीन है कि मैं इसके आसपास काम कर सकता हूं। इस प्रकार फिक्सिंग मेरी बड़ी समस्या नहीं है मेरी समस्या यह है कि यह व्यवहार पूरी तरह से विरोधाभास है कि मैं कैसे "सोचा" यह काम करेगा, और यह मुझे पागल कर रहा है!

    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>

का परिणाम:

समारोह कॉल [6,6,7,8,10,8,9] से पहले मूल सरणी

फ़ंक्शन कॉल के बाद मूल एआरए [10 9, 7, 6, 5]

सरणी को सॉर्ट किया गया है (जो मुझे उम्मीद है, और सही है)। हालांकि, 8 एस भी गायब हैं मुझे इसकी आशा नहीं थी। 8s को सरणी डिलीटेअट (जोड़ीआरेरे, आई) और सरणी डिलीटेअट (जोड़ीअरे, आई -1) तरीके से पहले फ़ंक्शन में निकाल दिए जाते हैं। लेकिन यह केवल सरणी तर्क (जोड़ीअरे) से तत्वों को हटा देना चाहिए, मूल सरणी (या तो मैंने सोचा) नहीं।


यह बहुत भ्रमित हो सकता है, संरचनाओं को भी चिंतित करता है। एक <cfset arrayCopy = originalArray> और फिर सरणी को संशोधित करना कुछ फ़ंक्शन के साथ की नकल की गारंटी नहीं होगी कि मूल सरणी संरक्षित है। समाधान इस तरह एक गहरी प्रतिलिपि बनाना है:

<cfset arrayCopy = Duplicate(originalArray)>






lucee