2012-12-05 12 views
22

में तर्कों या पैरामीटर की चर संख्या के साथ फ़ंक्शन बनाना I Dart में तर्कों या पैरामीटर की चर संख्या के साथ फ़ंक्शन बनाने का कोई तरीका ढूंढ रहा हूं। मुझे पता है कि मैं इसके बजाय एक सरणी पैरामीटर बना सकता हूं, लेकिन मैं ऐसा नहीं करना चाहूंगा क्योंकि मैं लाइब्रेरी पर काम कर रहा हूं जहां सिंटैक्टिक ब्रेवटी महत्वपूर्ण है।डार्ट

function superHeroes() { 
    for (var i = 0; i < arguments.length; i++) { 
    console.log("There's no stopping " + arguments[i]); 
    } 
} 

superHeroes('UberMan', 'Exceptional Woman', 'The Hunk'); 

हालांकि, डार्ट में, कि कोड नहीं चलेगा:

उदाहरण के लिए, सादे जावास्क्रिप्ट में, हम कुछ इस तरह (here से उधार) कर सकता है। क्या डार्ट में एक ही काम करने का कोई तरीका है? यदि नहीं, तो क्या यह कुछ ऐसा है जो रोडमैप पर है?

उत्तर

16

अब आप ऐसा नहीं कर सकते हैं।

मुझे वास्तव में पता नहीं है कि varargs वापस आ जाएगा - वे कुछ समय पहले थे लेकिन have been removed

हालांकि varargsEmulating functions के साथ अनुकरण करना संभव है। नीचे कोड स्निपेट देखें।

typedef dynamic OnCall(List); 

class VarargsFunction extends Function { 
    OnCall _onCall; 

    VarargsFunction(this._onCall); 

    call() => _onCall([]); 

    noSuchMethod(Invocation invocation) { 
    final arguments = invocation.positionalArguments; 
    return _onCall(arguments); 
    } 
} 

main() { 
    final superHeroes = new VarargsFunction((arguments) { 
    for (final superHero in arguments) { 
     print("There's no stopping ${superHero}"); 
    } 
    }); 
    superHeroes('UberMan', 'Exceptional Woman', 'The Hunk'); 
} 
+0

वाह वास्तव में एक साफ समाधान है। मैं डार्ट को तर्कों को संभालने के तरीके की तरह करता हूं, लेकिन इससे डेवलपर्स की मदद मिलेगी जो इसे दूसरी तरह पसंद करते हैं। –

+0

बहुत अच्छा! मैंने भाषा के आमंत्रण मिरर भाग में बहुत कुछ नहीं देखा था, इसलिए एक महान उदाहरण के लिए धन्यवाद।मैंने आपके उत्तर को एक संस्करण बनाने के लिए थोड़ा सा tweaked जो डार्ट के वर्तमान संस्करण पर काम करता है। – plowman

2

उदाहरण के लिए आपने लिखा है, मुझे लगता है कि आप एक सूची का उपयोग कर सबसे अच्छे हैं। उसके लिए माफ़ करना!

मैं dartbug.com देख रहा हूं, लेकिन मुझे इसके लिए एक सुविधा अनुरोध नहीं दिख रहा है। आप निश्चित रूप से एक बनाने के लिए स्वागत है!

5

मैं एलेक्जेंडर Ardhuin के जवाब के साथ एक छोटे से आसपास खेला और पाया कि हम चीजों की एक जोड़ी ठीक कर सकते हैं डार्ट के वर्तमान संस्करण में यह काम करने के लिए:

class VarArgsClass { 
    noSuchMethod(InvocationMirror invocation) { 
    if (invocation.memberName == 'superheroes') { 
     this.superheroes(invocation.positionalArguments); 
    } 
    } 

    void superheroes(List<String> heroNames) { 
    for (final superHero in heroNames) { 
     print("There's no stopping ${superHero}!"); 
    } 
    } 
} 

main() { 
    new VarArgsClass().superheroes('UberMan', 'Exceptional Woman', 'The Hunk'); 
} 

यह, समस्याओं के बहुत सारे है जिनमें शामिल हैं:

  • जहां भी आप superheroes() पर कॉल करते हैं तो एक चेतावनी उत्पन्न होती है क्योंकि हस्ताक्षर आपके पैरामीटर से मेल नहीं खाता है।
  • सुपर मैनुअल को पारित तर्कों की सूची वास्तव में List<String> सुनिश्चित करने के लिए अधिक मैन्युअल जांच करने की आवश्यकता होगी।
  • noSuchMethod() में सदस्य का नाम जांचने की आवश्यकता है यदि आप विधि नाम बदलते हैं तो आप 'सुपरहीरो' स्ट्रिंग को बदलना भूल जाएंगे।
  • प्रतिबिंब कोड पथ को ट्रेस करने में कठोर बनाता है।

लेकिन यदि आप उन सभी मुद्दों के साथ ठीक हैं, तो यह काम पूरा हो जाता है।

+1

एक अन्य मुद्दा है जो मुझे विश्वास है कि _has to_ का उल्लेख किया जाना चाहिए: यह केवल तभी काम करेगा यदि आप एक से अधिक तर्क पारित करते हैं। यदि आप केवल एक स्ट्रिंग पास करते हैं, तो आप मूल सुपरहीरो विधि को कॉल करेंगे और NoSuchMethod मशीनरी को अनदेखा कर दिया जाएगा। – Ladicek

3

यदि आप वास्तव में सिंटैक्टिक ब्रेवटी में हैं, तो बस 10 वैकल्पिक पोजिशनल पैरामीटर के साथ एक फ़ंक्शन/विधि घोषित करें और किया जाए। यह असंभव है कि कोई 10 से अधिक तर्कों के साथ कॉल करेगा।

यदि यह हैक की तरह लगता है, तो ऐसा इसलिए है क्योंकि यह है एक हैक। लेकिन मैंने डार्ट टीम को ऐसा ही देखा है :-)

+0

मैंने पहले ही @kludge मेटाडाटा –

+0

जोड़ा है और फिर विधि को दस तर्कों में से प्रत्येक के लिए विशेष जांच करनी होगी (यदि arg1! = Null ..., अगर arg2! = Null ...)? कुल! –

+0

मैंने पहले ही कहा है कि यह एक हैक है, और इसकी कीमत है कि एपीआई डिजाइनर भुगतान करने के इच्छुक हो सकता है। – Ladicek

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