2016-05-23 11 views
12

मेरे पास कुछ रचनाकार और कार्य हैं जिन्हें मैं हमेशा नामांकित तर्कों के साथ बुलाया जाना चाहता हूं। क्या इसकी आवश्यकता है?नामांकित तर्कों का उपयोग करने के लिए मैं कुछ रचनाकारों/कार्यों को कॉल कैसे कर सकता हूं?

मैं निर्माणकर्ता और कई मानकों के साथ और उन है कि और अधिक स्पष्ट रूप जब नामित तर्क उपयोग किया जाता है को पढ़ने के लिए कार्यों के लिए यह करने के लिए सक्षम होने के लिए करना चाहते हैं, आदि

+1

प्रासंगिक कोटलिन बग: https://youtrack.jetbrains.com/issue/KT-14934 –

उत्तर

13

मैं Kotlin में यह करने के लिए एक रास्ता मिल गया है 1.0 stdlib से Nothing का उपयोग करके:

/* requires passing all arguments by name */ 
fun f0(vararg nothings: Nothing, arg0: Int, arg1: Int, arg2: Int) {} 
f0(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments 
//f0(0, 1, 2)      // doesn't compile without each required named argument 

/* requires passing some arguments by name */ 
fun f1(arg0: Int, vararg nothings: Nothing, arg1: Int, arg2: Int) {} 
f1(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments 
f1(0, arg1 = 1, arg2 = 2)   // compiles without optional named argument 
//f1(0, 1, arg2 = 2)    // doesn't compile without each required named argument 

Array<Nothing> के रूप में Kotlin में गैर कानूनी है, vararg nothings: Nothing के लिए एक मूल्य में पारित होने के लिए (प्रतिबिंब से कम मुझे लगता है) नहीं बनाया जा सकता। हालांकि यह एक हैक का थोड़ा सा लगता है और मुझे संदेह है कि Nothing के खाली सरणी के लिए बाइटकोड में कुछ ओवरहेड है लेकिन ऐसा लगता है कि यह काम करता है।

यह दृष्टिकोण डेटा क्लास प्राथमिक रचनाकारों के लिए काम नहीं करता है जो vararg का उपयोग नहीं कर सकते हैं लेकिन इन्हें private के रूप में चिह्नित किया जा सकता है और माध्यमिक रचनाकारों का उपयोग vararg nothings: Nothing के साथ किया जा सकता है।

हालांकि, यह दृष्टिकोण कोटलिन 1.1 में काम नहीं करता है: "निषिद्ध vararg पैरामीटर प्रकार: कुछ नहीं"। :-(

शुक्र है, कोटलिन 1.1 में आशा खोई नहीं जा रही है। आप अपनी खुद की खाली कक्षा को निजी कन्स्ट्रक्टर (Nothing) के साथ परिभाषित करके इस पैटर्न को दोहरा सकते हैं, और इसे पहले varargs पैरामीटर के रूप में उपयोग कर सकते हैं। बेशक, अगर मजबूर नामों के तर्कों को औपचारिक रूप से समर्थित किया गया तो ऐसा नहीं किया जाना चाहिए।

+14

हालांकि यह भाषा के डिजाइन द्वारा कभी इरादा नहीं था , मैं आपकी सरलता की सराहना करता हूं :) –

+0

आप * arrayOf () के साथ कुछ भी नहीं बना सकते हैं। या आपको लगता है कि, मुझे लगता है कि – Deanveloper

+0

@ डेवलपर मैंने अभी कोशिश की है। मुझे मिलता है: "अप्रशिक्षित [अरे रिटर्न प्रकार में अवैध है" और "संशोधित प्रकार पैरामीटर के रूप में 'कुछ भी नहीं' का उपयोग नहीं कर सकता"। यहां तक ​​कि यदि आप कर सकते हैं, उदाहरण के लिए, 'f0 (* arrayOf (), 0, 1, 2)' स्प्रेड सरणी की सामग्री के साथ संयुक्त होते हैं जो एक अलग त्रुटि का कारण बनता है: "पूर्णांक अक्षर नहीं है अपेक्षित प्रकार के अनुरूप कुछ नहीं "। – mfulton26

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

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