2012-11-01 12 views
8

क्या हम f के बाहर से प्रतिबिंब का उपयोग करके val s: String का प्रकार प्राप्त कर सकते हैं?संरचनात्मक उपप्रकार प्रतिबिंब

val f = (r: {val s: String}) => { 
} 
+0

2.9 या 2.10 के तहत या इससे कोई फर्क नहीं पड़ता? –

+0

इससे कोई फर्क नहीं पड़ता 2.9 या 2.10। लेकिन मैं आमतौर पर 2.9.2 का उपयोग कर रहा हूँ। – sndyuk

+1

मुझे अत्यधिक संदेह है कि यह कंपाइलर के साथ काम किए बिना 2.9 में संभव है। 2.10 में प्रतिबिंब एपीआई है जो शायद 'आर' के प्रकार की जांच की अनुमति देगी। – pedrofurla

उत्तर

10
scala> import scala.reflect.runtime.{universe => ru} 
import scala.reflect.runtime.{universe=>ru} 

scala> import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.universe._ 

scala> def typeOf[T: ru.TypeTag](x: T) = ru.typeOf[T] // capture compile-time type info 
typeOf: [T](x: T)(implicit evidence$1: reflect.runtime.universe.TypeTag[T])reflect.runtime.universe.Type 

scala> val f = (r: {val s: String}) => {} 
f: AnyRef{val s: String} => Unit = <function1> 

scala> val tpe = typeOf(f) 
tpe: reflect.runtime.universe.Type = scala.AnyRef{val s: String} => Unit 

scala> ru.showRaw(tpe) 
res0: String = TypeRef(ThisType(scala), scala.Function1, List(RefinedType(List(TypeRef(ThisType(scala), newTypeName("AnyRef"), List())), Scope(newTermName("s"))), TypeRef(ThisType(scala), scala.Unit, List()))) 

scala> val ru.TypeRef(_, _, refinement :: _) = tpe 
refinement: reflect.runtime.universe.Type = scala.AnyRef{val s: String} 
स्काला प्रतिबिंब के रूप में निम्नानुसार एक भी संरचनात्मक प्रकार के लिए mocks उत्पन्न कर सकते हैं के साथ

: https://gist.github.com/4008389। लिंक किया गया गस्ट टूलबॉक्स और रनटाइम प्रतिबिंब का उपयोग करता है, लेकिन यह परिदृश्य मैक्रोज़ के साथ भी लागू करने योग्य दिखता है।

+0

स्कैला का कौन सा संस्करण आप उपयोग करते हैं? मुझे अंतिम वक्तव्य पर एक चेतावनी मिलती है: 'चेतावनी: अमूर्त प्रकार पैटर्न reflect.runtime.universe.TypeRef अनचेक किया गया है क्योंकि इसे मिटा दिया गया है – sschaef

+1

आयात आवश्यक है। यह टाइपरफ के लिए स्कोप में एक क्लास टैग लाता है, जो अनचेक चेतावनी को समाप्त करता है। –

+0

क्या परिष्करण का उदाहरण बनाने का कोई तरीका है? – sndyuk