2012-11-01 11 views
8

Czy możemy uzyskać typ val s: String za pomocą odbicia od zewnątrz funkcji f?Strukturalne podtynkowe odbicie

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

Poniżej 2.9 lub 2.10, czy to nie ma znaczenia? –

+0

Nie ma znaczenia 2.9 ani 2.10. Ale zwykle używam wersji 2.9.2. – sndyuk

+1

Bardzo wątpię, czy to możliwe w wersji 2.9 bez pracy z kompilatorem. W 2.10 znajduje się api odbicia, które prawdopodobnie pozwoli na sprawdzenie typu 'r'. – pedrofurla

Odpowiedz

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} 

z Scala odbicia można również wytwarzać kpi dla typów konstrukcyjnych: https://gist.github.com/4008389. Połączony punkt kontrolny działa za pomocą bibliotek narzędzi i refleksów środowiska wykonawczego, ale ten scenariusz można również zaimplementować za pomocą makr.

+0

Z jakiej wersji Scala korzystasz? Dostaję ostrzeżenie na ostatniej instrukcji: 'warning: typ abstrakcyjny reflect.runtime.universe.TypeRef jest odznaczony, ponieważ jest eliminowany przez wymazanie' – sschaef

+1

Import jest konieczny. Wprowadza tag klasy dla TypeRef do zakresu, co eliminuje niezaznaczone ostrzeżenie. –

+0

Czy istnieje sposób utworzenia instancji udoskonalania? – sndyuk