मैंने 15 से अधिक वर्षों तक कोल्डफ्यूजन प्रोग्राम किया है, लेकिन इस पर कभी नहीं आया।ठंडे फ़्यूज़न तर्कों का अजीब व्यवहार बाहरी कार्य को जीवित करता है?
<cfset _run()>
<cffunction name="_run">
<cfset variables.dataArray=ArrayNew(1)>
<cfset local.data={
area="profile"
}>
<cfset _append(data=local.data,field="name")>
<cfset _append(data=local.data,field="phone")>
<cfdump var="#variables.dataArray#" label="dataArray">
</cffunction>
<cffunction name="_append">
<cfargument name="data" type="struct" required="yes">
<cfargument name="field" type="string" required="yes">
<cfdump var="#arguments#" label="arguments">
<cfset arguments.data.field=arguments.field>
<cfset ArrayAppend(variables.dataArray,arguments.data)>
</cffunction>
आप इस देख सकते हैं है कि मुझे क्या करना: यहाँ व्यवहार को दोहराने के लिए एक कोड है
- चर दायरे में एक सरणी Initing एक struct Initing यह विश्व स्तर पर सुलभ
- बनाने के लिए स्थानीय गुंजाइश
- _append समारोह
- करने के लिए डेटा लागू वीं में दूसरे क्षेत्र आइटम (फोन) जोड़कर पहले क्षेत्र आइटम (नाम) जोड़ में (local.data) ई में एक ही तरीके
इस कोड को निम्नलिखित उत्पादन में परिणाम होगा:
आप देख सकते हैं, डुप्लिकेट प्रविष्टियों, साथ एक सरणी में कोड परिणाम जब आप उम्मीद कर सकते हैं कि पहले सूचकांक फ़ील्ड = "नाम" होना चाहिए। जैसा कि आप भी देख सकते हैं, दूसरी बार _app करने के लिए लागू डेटा का मूल्य, "फ़ील्ड" मान के साथ "फ़ील्ड" गुण होता है। ऐसा लगता है कि पहली बार हम समारोह कहलाते हुए तर्क के दायरे में रहते हैं? यह कैसे संभव है। मैंने सोचा कि तर्क का दायरा कैफंक्शन टैग के अंदर अलग किया गया था?
लेकिन अगर मैं इस के साथ _append समारोह की जगह:,
आप देख सकते हैं arguments.data का डुप्लिकेट बनाने:
<cffunction name="_append">
<cfargument name="data" type="struct" required="yes">
<cfargument name="field" type="string" required="yes">
<cfdump var="#arguments#" label="arguments">
<cfset local.data=Duplicate(arguments.data)>
<cfset local.data.field=arguments.field>
<cfset ArrayAppend(variables.dataArray,local.data)>
</cffunction>
यह निम्न उत्पादन दे देंगे इसे "फ़ील्ड" जोड़ने से पहले, समस्या हल करती है। ध्यान दें कि बस कर रहे हैं:
<cfset local.data=arguments.data>
पर्याप्त नहीं था।
क्या कोई तर्क के दायरे के इस व्यवहार को समझा सकता है?
हाँ, सबसे जटिल वस्तुओं पारित कर रहे हैं भविष्य में मुसीबत से बाहर मुझे रखेंगे संदर्भ द्वारा। Arrays एक अजीब अपवाद हैं। ज्यादातर बार वे "मूल्य से" पारित होते हैं। तो _append की तरह एक udf उस फ़ंक्शन के बाहर सरणी की स्थिति को संशोधित नहीं कर सका। – Ageax
आप जावा के ऐरेलिस्ट ('createObject (" जावा, "java.util.ArrayList") का उपयोग कर सकते हैं। Init() ') यदि आपको संदर्भ द्वारा सरणी की आवश्यकता है। – Alex