क्या स्कैला-मैक्रोज़ का उपयोग करके दिए गए कन्स्ट्रक्टर के पैरामीटर नाम प्राप्त करने का कोई तरीका है?
धन्यवाद
उत्तर:
जवाब के लिए 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)