मैं 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 पैरामीटर के रूप में उपयोग कर सकते हैं। बेशक, अगर मजबूर नामों के तर्कों को औपचारिक रूप से समर्थित किया गया तो ऐसा नहीं किया जाना चाहिए।
प्रासंगिक कोटलिन बग: https://youtrack.jetbrains.com/issue/KT-14934 –