2011-08-26 12 views
5

मैं एक समारोह है कि एक पंजीकरण पृष्ठ पर कुछ जानकारी के माध्यम से लूप लिख रहा हूँ। लूप के भीतर मैं एक सरणी के आधार पर कार्यों को कॉल करने की कोशिश कर रहा हूं। मुझे जो समस्याएं आ रही हैं वह वास्तव में कार्यों को सही तरीके से कॉल कर रही है, क्योंकि मैं फ़ंक्शन नाम के हिस्से के रूप में एक चर को शामिल करने का प्रयास कर रहा हूं। validate_email, validate_uname, validate_pass:मैं कोल्डफ्यूज़न में फ़ंक्शन नाम के हिस्से के रूप में एक चर नाम को कैसे कॉल कर सकता हूं?

<cfscript> 
fields = arraynew(1); 
fields[1] = 'r_email'; 
fields[2] = 'r_uname'; 
fields[3] = 'r_pass'; 

for(i = 1; i lte arraylen(fields); i = i + 1) 
{ 
    func = fields[i].split('r_'); 
    func = 'validate_#func[2]#(#fields[i]#)'; 
} 
</cfscript> 

तो, मैं तीन कार्य होते हैं:

यहाँ मेरी कोड है। अगर मैं एक writeoutput() में फेंक देता हूं, और फ़ंक्शन के परिणामों को आउटपुट करने का प्रयास करता हूं, तो वे काम नहीं करते हैं।

<cfscript> 
fields = arraynew(1); 
fields[1] = 'r_email'; 
fields[2] = 'r_uname'; 
fields[3] = 'r_pass'; 

for(i = 1; i lte arraylen(fields); i = i + 1) 
{ 
    func = fields[i].split('r_'); 
    func = 'validate_#func[2]#(#fields[i]#)'; 
    writeoutput('#func#'); 
} 
</cfscript> 

अब, मैं समझता हूँ कि जब आप writeoutput() का उपयोग कर रहे हैं, और आप एक समारोह कॉल कर रहे हैं, आप या तो अंत पर हैश प्रतीक की जरूरत है:

यहाँ कि कोड है। तो, चलो कहते हैं कि मैं इसे इस तरह लिख दें:

writeoutput('#validate_#func[2]#(#fields[i]#)#'); 

यह काम नहीं करेगा, क्योंकि दूसरा हैश प्रतीक बाहर रद्द समारोह कॉल।

writeoutput('#validate_email('[email protected]')#'); 

मैं कैसे उचित चर नाम के साथ 'ईमेल' (#validate_email ...) की जगह ले सकता है, और अभी भी समारोह काम है: यह समारोह अंततः कैसी दिखनी चाहिए, (ईमेल उदाहरण) है? मुझे आशा है कि मैंने इसे समझ में लाया है!

उत्तर

10

कार्य चर भी हैं, तो उसी तरह से आप के लिए सरणियों, structs, और स्कोप ब्रैकेट संकेतन का उपयोग कर सकते हैं, तो आप गतिशील चर नाम (और इस प्रकार गतिशील समारोह नाम)

उदाहरण के लिए उपयोग करने के लिए इस का उपयोग कर सकते हैं:

<cfloop index="Field" list="email,uname,pass"> 
    <cfset Result = Variables['validate_'&Field](Variables['r_'&Field]) /> 
    ... 
</cfloop> 

अच्छा ... बिल्कुल नहीं। एडोब ColdFusion में एक बग के कारण, कि उस तरह काम नहीं करता है (हालांकि यह Railo जैसे अन्य CFML इंजन में करता है,), और आप, यह दो पंक्तियों में विभाजित करने के लिए है इस तरह:

<cfloop index="Field" list="email,uname,pass"> 
    <cfset TmpFunc = Variables['validate_'&Field] /> 
    <cfset Result = TmpFunc(Variables['r_'&Field]) /> 
    ... 
</cfloop> 

(यह मान लें कि दोनों फ़ंक्शन और फ़ील्ड्स variables स्कोप में हैं, यदि उन्हें आपको किसी भी स्कोप में संदर्भित करने की आवश्यकता नहीं है।)

यह विधि किसी समस्या में होती है यदि फ़ंक्शन किसी ऑब्जेक्ट में होता है, तो यह उन चर के संदर्भ खो देता है।

CF10 पर, invoke फ़ंक्शन है। सीएफ के पहले संस्करणों को cfinvoke टैग का उपयोग करने की आवश्यकता है।


(छोड़कर

+0

यह सीएफ में एक बग नहीं है, पीटर: इसे अभी तक लागू नहीं किया गया है। आप उस प्रभाव पर अपनी टिप्पणी को संशोधित करना चाहेंगे। अन्यथा एक स्पॉट-ऑन उत्तर। –

+3

'Variables.Bob()' और 'चर [' बॉब ']()' के बीच कोई अंतर नहीं होना चाहिए - हालांकि, दूसरा एक त्रुटि फेंकता है। मैं ब्रैकेट नोटेशन में एक बग कहता हूं, एक अनुपूरक सुविधा नहीं। –

+0

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

1

पीटर उत्तर पर स्थान है (एक तरफ ध्यान दें के रूप में, CF10 ब्रैकेट अंकन के साथ समारोह परिणाम को संदर्भित करने का उलटा की क्षमता है, यानी doSomething()[key] जो समय पर उपयोगी में आता है जोड़ें। किया था) "बग" संदर्भ जिस पर मैंने टिप्पणी की थी)। एक अन्य विकल्प यदि कोई सीएफएसक्रिप्ट ब्लॉक के बीच में नहीं है तो <cfinvoke> एक स्ट्रिंग को अपने METHOD विशेषता मान के रूप में लेता है, और यह स्पष्ट रूप से - किसी भी गतिशील मान को पसंद कर सकता है।

यह आपकी विशिष्ट स्थिति के लिए बहुत मदद नहीं है, लेकिन यह ध्यान में रखना आसान है।

मैं मूल्यांकन() दृष्टिकोण का उपयोग नहीं करता।

0

मैं इसे कोल्डफ्यूजन 6.1 और जावा पर जाने से पहले जोड़ूंगा, मूल्यांकन() को हमेशा प्रदर्शन के लिए अनाथाश्रम माना जाता था, लेकिन 6.1 के बाद से यह अभिव्यक्ति का मूल्यांकन करता है और उसके बाद शामिल स्ट्रिंग के साथ एक इनलाइन पेज कॉन्टेक्स्ट बनाता है ।

बहुत हल्का, बहुत प्रदर्शनकारी।

तो, सरल और सबसे सरल तरीका है अपने उद्देश्य को प्राप्त करने के लिए है:

<cfset result = validate_username(variables.r_username) /> 
:

<cfset result = evaluate("validate_#Field#(variables.r_#Field#)") /> 

तो यह सोचते हैं आप एक क्षेत्र "उपयोगकर्ता नाम" का नाम दिया है, इस लिए निम्न विधि कॉल के बराबर हो जाएगा

और जो कुछ भी वह लौटाता है उसे variables.result को सौंपा जाएगा।

परीक्षणों में यह वास्तव में एक नए नाम के लिए एक विधि को पुन: असाइन करने की ब्रैकेट-नोटेशन तकनीक से बेहतर प्रदर्शन करता है। मेरे पास इस समय आंकड़े नहीं हैं लेकिन यह काफी मार्जिन से तेज़ है क्योंकि एक चर असाइनमेंट की तुलना में एक तेज़ गति (और पार्सिंग/संकलन के एक अलग चरण में होता है) होता है।

+0

मूल्यांकन के खिलाफ एडम की सलाह के लिए(), बेवकूफ होने के अलावा और उपयोगकर्ता द्वारा प्रदत्त मानों का मूल्यांकन करने के लिए इसका उपयोग करने के लिए (जैसे उपयोगकर्ताओं को अनिवार्य रूप से कोड टाइप करने की इजाजत देता है - हाँ, यह किया गया है) इस विधि का उपयोग करने से बचने का कोई कारण नहीं है। कोई लंबा प्रदर्शन या सुरक्षा समस्या नहीं है। – jrypkahauer

0

एक इस मुद्दे पर अन्य दृष्टिकोण के रूप में उपयोग करने के लिए एक यूडीएफ ऐसी है निम्नलिखित:

<cffunction name="callMethod"> 
     <cfargument name="methodName" type="string" required="true" /> 
     <cfargument name="methodArgs" type="struct" default="#{}#" /> 
     <cfset var rslt = 0 /> 
     <cfinvoke method="#arguments.methodName#" argumentcollection="#arguments.methodArgs#" returnvariable="rslt" /> 
     <!--- account for the possibility that the method call wiped out the rslt variable ---> 
     <cfif structKeyExists(local,'rslt')> 
      <cfreturn rslt /> 
     </cfif> 
    </cffunction> 

आप आप की जरूरत सकता है इस हैं:

<cfinclude template="invokerudf.cfm" /> 
    <cfscript>...</cfscript> 

या टैग में यह लपेट और टॉस

<cfset retval = createObject("methodinvoker").callMethod(methodName,methodArgs) /> 

वहाँ ऐसा ... बस विभिन्न विचारों अब घालना वहाँ बाहर बनाने के लिए कई, कई तरीके हैं: एक सीएफसी में।

संबंधित मुद्दे

 संबंधित मुद्दे