/ / स्कैला-मैक्रोज़ का उपयोग कर कन्स्ट्रक्टर तर्क नाम कैसे प्राप्त करें - स्कैला, प्रतिबिंब, कन्स्ट्रक्टर, मैक्रोज़, स्कैला-मैक्रोज़

स्कैला-मैक्रोज़ - स्कैला, प्रतिबिंब, कन्स्ट्रक्टर, मैक्रोज़, स्कैला-मैक्रोज़ का उपयोग करके कन्स्ट्रक्टर तर्क नाम कैसे प्राप्त करें

क्या स्कैला-मैक्रोज़ का उपयोग करके दिए गए कन्स्ट्रक्टर के पैरामीटर नाम प्राप्त करने का कोई तरीका है?

धन्यवाद

उत्तर:

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

ध्यान दें कि :power पॉल बुचर के जवाब में दृष्टिकोण आपको देता हैआंतरिक एपीआई तक पहुंच, जो शायद या तो आवश्यक नहीं है या वांछित है अगर आप इसे मैक्रो में करने की कोशिश कर रहे हैं (या उस मामले के लिए आरईपीएल के बाहर रनटाइम प्रतिबिंब में)।

तो उदाहरण के लिए कॉलिंग isConstructor एक सादे पुराने पर Symbol द्वारा उपलब्ध कराया गया members सार्वजनिक प्रतिबिंब एपीआई में "टी काम नहीं हुआ - आपको पहले यह सुनिश्चित करने की ज़रूरत है कि आपके पास एक है MethodSymbol। इसी प्रकार के साथ tpe। आप निश्चित रूप से गैर-आरईपीएल कोड में आंतरिक एपीआई को डाल सकते हैं, लेकिन यह खतरनाक और अनावश्यक है। निम्नलिखित एक बेहतर समाधान है:

import scala.reflect.runtime.universe._

class Foo(name: String, i: Int) { def this(name: String) = this(name, 0) }

typeOf[Foo].declaration(nme.CONSTRUCTOR).asTerm.alternatives.collect {
case m: MethodSymbol => m.paramss.map(_.map(_.name))
}

या केवल:

typeOf[Foo].declarations.collect {
case m: MethodSymbol if m.isConstructor => m.paramss.map(_.map(_.name))
}

ये दोनों आपको निम्नलिखित देंगे:

List(List(List(name, i)), List(List(name)))

जैसी इच्छा। मैंने उदाहरण को सरल बनाने के लिए यहां रनटाइम प्रतिबिंब का उपयोग किया है, लेकिन यह ठीक उसी तरह काम करेगा Universe आप से मिलते हैं Context एक मैक्रो में


उत्तर № 2 के लिए 1

यह आरईपीएल प्रतिलेख आपको जाना चाहिए, मुझे उम्मीद है:

Welcome to Scala version 2.10.0-RC5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_09).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :power
** Power User mode enabled - BEEP WHIR GYVE **
** :phase has been set to "typer".          **
** scala.tools.nsc._ has been imported      **
** global._, definitions._ also imported    **
** Try  :help, :vals, power.<tab>           **

scala> class Foo(x: Int, y: Float)
defined class Foo

scala> (typeOf[Foo].members find (_.isConstructor)).get.tpe.params map (_.name)
res1: List[$r.intp.global.Symbol#NameType] = List(x, y)