2009-07-01 7 views
14

मैं एक ColdFusion समारोह "foo" जो तीन आर्ग लेता है, और दूसरा दो वैकल्पिक हैं:कोल्डफ्यूज़न में फ़ंक्शन कॉल करते समय केवल कुछ वैकल्पिक तर्क कैसे निर्दिष्ट करें?

<cffunction name="foo" access="public" returntype="any"> 
    <cfargument name="arg1" type="any" required="true" /> 
    <cfargument name="arg2" type="any" required="false" default="arg2" /> 
    <cfargument name="arg3" type="any" required="false" default="arg3" /> 

    ... 

    <cfreturn whatever /> 
</cffunction> 

मैं foo कॉल करने के लिए, ARG1 और arg3 में गुजर चाहते हैं, लेकिन ARG2 बाहर हो जाता है। मुझे पता है कि यह संभव है अगर मैं cfinvoke का उपयोग करके फ़ंक्शन को कॉल करता हूं, लेकिन यह वाक्यविन्यास वास्तव में वर्बोज़ और जटिल है। मैंने इन दो दृष्टिकोणों की कोशिश की है, न तो काम करता है:

<cfset somevar=foo(1, arg3=3) /> <!--- gives syntax error ---> 
<cfset somevar=foo(1, arg3:3) /> <!--- gives syntax error ---> 

उत्तर

29

आपको पूरे नामों के नामों का उपयोग करना होगा। आप कुछ अन्य भाषाओं में नाम और स्थितित्मक तर्कों को मिश्रित नहीं कर सकते हैं।

<cfset somevar = foo(arg1=1, arg3=3) /> 
2

अगर आप नामित आर्ग का उपयोग आप पहली बार भी

<cffunction name="foo" access="public" returntype="any"> 
    <cfargument name="arg1" type="any" required="true" /> 
    <cfargument name="arg2" type="any" required="false" default="arg2" /> 
    <cfargument name="arg3" type="any" required="false" default="arg3" /> 

    <cfreturn arg2 & " " & arg3> 
</cffunction> 


<cfset b = foo(arg1:1,arg3:2)> 
<cfoutput>#b#</cfoutput> 
20

या .. आप उपयोग कर सकते ArgumentCollection

CF9 में या इसके बाद के नाम के लिए है ...

<cfset somevar = foo(argumentCollection={arg1=1, arg3=3})> 

CF8 या ऊपर में ...

<cfset args = {arg1=1, arg3=3}> 
<cfset somevar = foo(argumentCollection=args)> 

CF7 हैं या नीचे ...

+0

इस प्रकार मैं आम तौर पर इसे करना पसंद करता हूं। मैं अनुमान लगा सकता हूं कि रनटाइम पर कौन से तर्क शामिल हैं। ब्लॉक के अंदर लपेटना अच्छा और आसान है। – ale

+1

जैसा कि अल का तात्पर्य है, आपको यह दिखाने के लिए अपने उदाहरण अपडेट करना चाहिए कि ArgumentCollection का एक बड़ा लाभ यह है कि यह आपको फ़ंक्शन पर भेजने से पहले, एक लचीली फैशन में structs को बनाने/कुशल बनाने में मदद करता है - आपके वर्तमान उदाहरण केवल एक लंबी हवा वाली हैं सभी नामित तर्कों का उपयोग करने का तरीका। :) –

+1

यह भी ध्यान देने योग्य है कि आप नामांकित तर्कों और तर्कसंगत चयन को एकल फ़ंक्शन कॉल में मिश्रित कर सकते हैं। –

0

मैं भी कुछ जवाब के लिए देख रहा था के रूप में किप तैनात। मैंने जो कुछ भी लागू किया है उसके बाद। उम्मीद है कि यह संभव समाधान की हमारी श्रृंखला में जोड़ सकता है। मैंने सिर्फ <cfparam> को कफक्शन कोड में जोड़ा:

<cffunction name="fn1" access="public" returntype="numeric"> 
    <cfargument name="arg1" type="numeric" required="true"> 
    <cfargument name="arg2" type="numeric" required="true"> 
    <cfargument name="arg3" type="query" required="false"> 
    <cfparam name="arguments.arg1" default=0> 
    <cfparam name="arguments.arg2" default=0> 
    <cfparam name="arguments.arg3" default=0> 
    <cfreturn arguments.arg1 + arguments.arg2 + arguments.arg3> 
</cffunction> 

<cfoutput>#fn1(arg1=1,arg2=2)#</cfoutput> 
+0

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