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}) => {
}
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}) => {
}
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.
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
Import jest konieczny. Wprowadza tag klasy dla TypeRef do zakresu, co eliminuje niezaznaczone ostrzeżenie. –
Czy istnieje sposób utworzenia instancji udoskonalania? – sndyuk
Poniżej 2.9 lub 2.10, czy to nie ma znaczenia? –
Nie ma znaczenia 2.9 ani 2.10. Ale zwykle używam wersji 2.9.2. – sndyuk
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