/ / क्या स्काला में मैक्रो एनोटेशन के बिना एक माध्यमिक निर्माता बनाना संभव है? - स्काला, स्काला-मैक्रोज़, स्काला-मैक्रो-पैराडाइज़

क्या स्कैला में मैक्रो एनोटेशन के बिना माध्यमिक कन्स्ट्रक्टर बनाना संभव है? - स्कैला, स्कैला-मैक्रोज़, स्कैला-मैक्रो-स्वर्ग

मैं एक मैक्रो बनाना चाहता हूं जो एक माध्यमिक कंस्ट्रक्टर {"बॉडी) उत्पन्न करता है। क्या मैक्रो एनोटेशन का सहारा लिए बिना ऐसा करना संभव है? (अर्थात मैक्रो-पैराडाइज प्लगइन)

उदाहरण के लिए:

कुछ इस तरह:

class A(a : String, b : String) {
def this(s : List[Any]) = macro fromlist
}

इस तरह से कुछ के बराबर होना चाहिए:

class A(a : String, b : String) {
def this(s : List[Any]) = this(s.head.toString, s.tail.head.toString)
}

बस "मैक्रो" कीवर्ड का उपयोग करने से मदद नहीं लगती है। क्या यह सादा स्काला में पूरी तरह से बंद है? धन्यवाद।

उत्तर:

जवाब के लिए 0 № 1

समस्या यह है, कि एक निर्माणकर्ता नहीं हैविधि एक नया उदाहरण लौटाती है, लेकिन एक विधि जो पहले से ही बनाई गई है, को इनिशियलाइज़ करती है। (अतः = आपकी कंस्ट्रक्टर परिभाषा में इसका कोई मतलब नहीं है, मूल कंस्ट्रक्टर कुछ भी वापस नहीं करता है)।

अगली समस्या यह है कि स्काला में एक वैकल्पिक कंस्ट्रक्टर को दूसरे कंस्ट्रक्टर को पहले चरण के रूप में कॉल करना पड़ता है, आप कुछ और नहीं कह सकते हैं, मैक्रो भी नहीं।

आप हालांकि, इस तरह मापदंडों को उत्पन्न करने के लिए एक मैक्रो कॉल कर सकते हैं

this(fromList(s): _*)

लेकिन आप भी ऐसा क्यों करना चाहेंगे? मल्टीपल कंस्ट्रक्टर होने के लिए स्काला में यह बहुत असामान्य है। सामान्य तरीका यह है कि साथी ऑब्जेक्ट में एक अधिभार लागू विधि है। आपके पास कोई प्रतिबंध नहीं है।