2012-12-11 37 views
5

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

धन्यवाद

उत्तर

5

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

उदाहरण एक सादे पुराने Symbol सार्वजनिक प्रतिबिंब एपीआई नहीं होंगे में members द्वारा प्रदान की पर isConstructor फोन करने के लिए

तो काम-आप पहले सुनिश्चित करें कि आप एक 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 से मिलता है।

+0

आह - पावर मोड के बारे में अच्छा बिंदु। मेरे ब्लश को बचाने के लिए धन्यवाद! –

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) 
+0

मैं इसे संकलित समय में स्कैला कक्षा में कैसे काम कर सकता हूं? –