2009-07-16 10 views
9

कोल्डफ्यूज़न में, arrayAppend() फ़ंक्शन एक सरणी और एक आइटम को जोड़ने के लिए लेता है। यह उस सरणी को संशोधित करता है जो पारित किया गया था और सफल होने पर सत्य लौटाता है।arrayAppend सही क्यों करता है और सूची Append सूची को वापस करें?

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

ये कार्य दो अलग-अलग तरीकों से क्यों कार्य करते हैं? मैं हमेशा प्रत्येक के वापसी मूल्य को याद रखने के लिए प्रलेखन में बदल रहा हूं।

उत्तर

10

ऐसा इसलिए है क्योंकि कोल्डफ्यूजन में कोई "सूची" डेटा प्रकार नहीं है।

ए "सूची" एक सीमित स्ट्रिंग है, जो कि सरल है। यह डिफ़ॉल्ट रूप से अल्पविराम से सीमित है, लेकिन आप डिलीमीटर चुन सकते हैं। "ListAppend()" एक स्ट्रिंग कॉन्सटेनेशन ऑपरेशन है, और इस तरह यह इसके काम का परिणाम "string1 & string2" जैसा होगा।

केवल एक चीज है कि "ListAppend()" आपके लिए है: यह डिलीमीटर हैंडलिंग का ख्याल रखता है, अनावश्यक डबल डिलीमीटरों को रोकता है - कुछ ऐसा जो "string1 & string2" नहीं कर सकता है।

एक सरणी वास्तविक डेटा प्रकार है और (एक स्ट्रिंग के विपरीत) जगह में संशोधित किया जा सकता है। यह ArrayAppend() करता है।

0

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

सरणी के साथ, सरणी का आकार स्थिर है और बदलता नहीं है, इसलिए कोई नया संदर्भ बनाने की आवश्यकता नहीं है।

+1

पूरी तरह से सही नहीं। सरणी का आकार सीएफ में हमेशा स्थिर नहीं होता है क्योंकि यह ऐरेलिस्ट का उपयोग करता है, जो गतिशील रूप से आकार बदलता है। लेकिन मुझे पता है कि आपका क्या मतलब है .. :) – Henry

+1

असल में, कोल्डफ्यूज़न में सरणी java.util.Vector का उपयोग करती है, लेकिन आप सही हैं क्योंकि आप नई वस्तुओं को जोड़ते समय क्षमता को गतिशील रूप से दोगुना कर देंगे। – Jayson

+0

ओह शांत, धन्यवाद जेसन। – Henry

4

यह समझने के लिए कि ऐसा क्यों होता है आपको स्ट्रिंग्स जावा में कैसे काम करते हैं, इस बारे में थोड़ा सा पता होना चाहिए क्योंकि कोल्डफ्यूज़न में एक सूची के अंतर्निहित कार्यान्वयन java.lang.String है।

<cfset list = "a,b,c"/> 
<cfoutput>#list.getClass()#</cfoutput> 

जावा में, स्ट्रिंग्स अपरिवर्तनीय हैं और स्ट्रिंग की सामग्री को संशोधित करने के लिए कोई तरीका नहीं है। आप जावा में निम्नलिखित किया था, तो आप एक स्ट्रिंग का एक नया उदाहरण बनाने की जाएगी और प्रत्येक कथन के लिए रों को यह बताए:

String s = "abc"; 
s = "def"; 
s = s.concat("ghi"); 

ColdFusion में listAppend() विधि का उपयोग करते हुए एक स्ट्रिंग का एक नया उदाहरण पैदा कर रही है हुड के नीचे और इसे वापस लौटने पर, इस तरह जब आप किसी सूची में मूल्य जोड़ते हैं तो ऐसा कुछ करने की आवश्यकता होती है।

<cfset list = "a,b,c"/> 
<cfset list = listAppend(list,'d')/> 
<cfoutput>#list#</cfoutput> 

हालांकि, जब तुम arrayAppend() के साथ एक सरणी को संशोधित, आप सीधे सरणी संशोधित कर रहे हैं, इस प्रकार वहाँ फिर से() के लिए ही मूल्य पुन: असाइन करने की तरह आप listAppend साथ की जरूरत है कोई जरूरत नहीं है।

+3

यदि आप थोड़ा सा देखते हैं, तो आप देखेंगे कि जावा के पास ListAppend() के व्यवहार से कोई लेना देना नहीं है। ListAppend() शुरुआत से इस तरह व्यवहार किया, जबकि जावा केवल CF6 के बाद से खेल का हिस्सा है। – Tomalak

1

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

इस का नतीजा यह है, तो आप अपने खुद के सरणी उपयोगिता कार्यों लिखते हैं, आप अक्सर समाप्त करने के लिए है कि है ऊपर इस तरह से उन्हें बुला:

<cfset MyArray = DoSomethingWithArray(MyArray)> 
संबंधित मुद्दे