2009-01-03 12 views
7

पायथन में फ़ंक्शंस को फ़ॉर्म कीवर्ड = मान के कीवर्ड तर्कों का उपयोग करके बुलाया जा सकता है। उदाहरण के लिए, निम्न कार्य:एक्शनस्क्रिप्ट 3 कार्यों में कीवर्ड तर्कों का अनुकरण कैसे करें

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'): 
    print "-- This parrot wouldn't", action, 
    print "if you put", voltage, "volts through it." 
    print "-- Lovely plumage, the", type 
    print "-- It's", state, "!" 

निम्न तरीकों में से किसी में कहा जा सकता है:

parrot(1000) 
    parrot(action = 'VOOOOOM', voltage = 1000000) 
    parrot('a thousand', state = 'pushing up the daisies') 
    parrot('a million', 'bereft of life', 'jump') 

ActionScript 3 इस सुविधा नहीं है। मैं इसे सर्वश्रेष्ठ अनुकरण कैसे करूं?

उत्तर

0

आप here दिखाए गए फ़ंक्शन में तर्कों की परिवर्तनीय संख्या का उपयोग करके कुछ समान कार्यान्वित कर सकते हैं।

+0

बहुत रोचक। आपको साइट से कोड स्निपेट को अपने उत्तर में जोड़ना चाहिए। – Soviut

+3

लेकिन यह सिर्फ एक पैरामीटर सरणी है। यह आपको पैरामीटर नामित नहीं करता है, या आपको पैरामीटर के क्रम में बदलने के लिए अनुमति देता है, पैरामीटर को छोड़ देता है, आदि – bzlm

7

यह संकलन समय पर किसी भी त्रुटि फेंक नहीं करेगा जब आप गंदगी, लेकिन आप कुछ इस तरह कर सकता है:

awesomefunction({ foo : 23, bar : 99 }); 

: जब यह इस तरह कर रही बुला

public function awesomefunction(input:Object):void { 
    if (input.foo) trace("got foo"); 
    if (input.bar) trace("got bar"); 
} 

और फिर {} ब्रैकेट एक इनलाइन ऑब्जेक्ट बनाते हैं। ऊपर दिए गए कोड की एक घना संस्करण इस तरह लिखा जा सकता है:

var obj:Object = new Object(); 
obj.foo = 23; 
obj.bar = 99; 
awesomefunction(obj); 

यदि आप इसे बजाय एक सरणी दे:

awesomefunction([23, 99 ]); 

([] btw एक सरणी के लिए आशुलिपि है)

सूचकांक इस तरह नहीं पहुंच पाएंगे:

public function awesomefunction(input:Object):void { 
    if (input[0]) trace("got foo"); 
    if (input[1]) trace("got bar"); 
} 

तो यह सब कपड़ा लाने के लिए इसके अलावा आप इस तथ्य का उपयोग कर सकते हैं कि || ऑपरेटर उद्देश्य यह है कि पहली बार सही का आकलन का मान देता है, बस सच करने के लिए नहीं:

public function awesomefunction(input:Object):void { 
    var foo:int = input.foo || input[0]; 
    var bar:int = input.bar || input[1]; 
    if (foo) trace("got foo:", foo); 
    if (bar) trace("got bar:", bar); 
} 

तो, इसके बाद के संस्करण समारोह इन सभी तीन कॉल के लिए एक ही आउटपुट दे देंगे:

awesomefunction({ foo : 23, bar :55 }); 
awesomefunction({ bar : 55, foo : 23 }); 
awesomefunction([ 23, 55 ]); 

हालांकि यह आप नाम और गिने मिश्रण करने की अनुमति देगा नहीं है, लेकिन आप इस तरह से कर सकते हैं:

awesomefunction({ foo : 23, 1 : 55 }); 

यह नहीं बहुत सुंदर है, लेकिन यह काम करता है!

1

नामक एक्शनस्क्रिप्ट 3.0 में एक विशेष प्रकार है ... (बाकी)। इस प्रकार को फ़ंक्शन के लिए पैरामीटर सूची में रखें और फिर वह फ़ंक्शन किसी भी तर्क को स्वीकार करने में सक्षम है। उचित sytanx है: ... arrayName, जहां arrayName सरणी का नाम है जो तर्क रखेगा।

 
public function forYou(...args) : void{ 
    for(var i : int = 0; i
+3

लेकिन यह सिर्फ एक पैरामीटर सरणी है। यह आपको पैरामीटर का नाम नहीं देता है, या आपको टाइप किए गए ऑब्जेक्ट का उपयोग करने के लिए पैरामीटर के क्रम में बदलने के लिए अनुमति देता है, पैरामीटर को इत्यादि। – bzlm

4

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

public class ComplaintData { 
    public var state:String = "a stiff"; 
    public var action:String = "voom"; 
    public var type:String = "Norwegian Blue"; 
    public var voltage:String; 

    public function ComplaintData(v:String) { 
     voltage = v; 
    } 
} 

// somewhere else.... 

function parrot(cd:ComplaintData) { 
    trace "-- This parrot wouldn't " + cd.action; 
    // etc. 
} 

var cd:ComplaintData = new ComplaintData("a million"); 
cd.action = "jump"; 
parrot(cd); 

तो अधिक तदर्थ, एक कम औपचारिक दृष्टिकोण वैकल्पिक पैरामीटर के उदारवादी उपयोग करते हैं, और फोन करने वाले किसी भी गैर-पीछे चल पैरामीटर वे छोड़ करना चाहते हैं के लिए अशक्त पारित करने के लिए अनुमति देने के लिए है। यह आपको लचीलापन हो जाता है, लेकिन आप सफाई के एक उचित सौदा बलिदान:

function parrot(voltage:String, 
       state:String=null, 
       action:String=null, 
       type:String=null) { 
    if (state==null) { state = 'a stiff'; } 
    if (action==null) { action = 'voom'; } 
    if (type==null) { type = 'Norwegian Blue'; } 
    // .... 
} 
parrot('1000') 
parrot('1000000', null, 'jump') 

लेकिन अगर इन दोनों विकल्पों बोझल लगता है, ऐसा इसलिए है क्योंकि वे कर रहे हैं है। लंबे समय तक, मुझे लगता है कि यह अंततः विचार को आंतरिक करने के लिए सबसे अच्छा है कि पैरामीटर सूचियों का आदेश एक्शनस्क्रिप्ट के व्याकरण का हिस्सा है, और आप शायद उनसे बचने की कोशिश नहीं कर रहे हैं। ऐसा करने के लिए या तो बलिदान सादगी (ऊपर के रूप में), या खराब प्रथाओं की ओर जाता है (जैसे पैरामीटर के लिए असंगठित वस्तुओं का उपयोग करना, जैसा कि अन्य उत्तरों में सुझाया गया है, जो प्रकार के कई फायदे बलिदान देता है- और त्रुटि-जांच)।

व्याकरण के साथ काम करने के लिए सबसे संतुलित तरीके से बस है वैकल्पिक पैरामीटर का उपयोग जब भी संभव हो, इस प्रकार: आप अभी भी तथ्य यह है कि केवल पीछे वाले पैरामीटर छोड़ा जा सकता है के साथ जीना है

function parrot(voltage:String, 
       state:String='a stiff', 
       action:String='voom', 
       type:String='Norwegian Blue') { 
    // ... 
} 
parrot('1000'); 
parrot('1000000', 'pushing up the daisies'); 
parrot('a million', 'bereft of life', 'jump') 

, लेकिन यह तरीका बताया गया है भाषा बनाई जाती है (और कैसे इसकी मूल विधियों को परिभाषित और उपयोग किया जाता है)।

+0

+1 या बस इससे निपटने के लिए। इसके साथ जा रहा है ... या एक अज्ञात ऑब्जेक्ट केवल आपके कोडबेस को बनाए रखने के लिए और अधिक कठिन बना देगा। –

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