क्या हम f
के बाहर से प्रतिबिंब का उपयोग करके val s: String
का प्रकार प्राप्त कर सकते हैं?संरचनात्मक उपप्रकार प्रतिबिंब
val f = (r: {val s: String}) => {
}
क्या हम f
के बाहर से प्रतिबिंब का उपयोग करके val s: String
का प्रकार प्राप्त कर सकते हैं?संरचनात्मक उपप्रकार प्रतिबिंब
val f = (r: {val s: String}) => {
}
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। लिंक किया गया गस्ट टूलबॉक्स और रनटाइम प्रतिबिंब का उपयोग करता है, लेकिन यह परिदृश्य मैक्रोज़ के साथ भी लागू करने योग्य दिखता है।
स्कैला का कौन सा संस्करण आप उपयोग करते हैं? मुझे अंतिम वक्तव्य पर एक चेतावनी मिलती है: 'चेतावनी: अमूर्त प्रकार पैटर्न reflect.runtime.universe.TypeRef अनचेक किया गया है क्योंकि इसे मिटा दिया गया है – sschaef
आयात आवश्यक है। यह टाइपरफ के लिए स्कोप में एक क्लास टैग लाता है, जो अनचेक चेतावनी को समाप्त करता है। –
क्या परिष्करण का उदाहरण बनाने का कोई तरीका है? – sndyuk
2.9 या 2.10 के तहत या इससे कोई फर्क नहीं पड़ता? –
इससे कोई फर्क नहीं पड़ता 2.9 या 2.10। लेकिन मैं आमतौर पर 2.9.2 का उपयोग कर रहा हूँ। – sndyuk
मुझे अत्यधिक संदेह है कि यह कंपाइलर के साथ काम किए बिना 2.9 में संभव है। 2.10 में प्रतिबिंब एपीआई है जो शायद 'आर' के प्रकार की जांच की अनुमति देगी। – pedrofurla