2013-05-03 13 views
8

Deneme amaçlı bir alan olan FieldMirror.get() öğesini çağırmayı denediğimde, deneysel Scala 2.10 yansımasını kullanarak, null değerini döndürür. Tembel valfi yansımayı kullanarak değerlendirmenin bir yolu var mı? Get() işlevi artık boş bırakılamaz. Tembel değeri yansıma kullanarak nasıl değerlendirebilirim?

bu örneği düşünün:

case class Person(val firstName: String, 
        val lastName: String) { 
    lazy val name = firstName + " " + lastName 
} 

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

val runtimeMirror = ru.runtimeMirror(getClass.getClassLoader) 

val fred = Person("Fred", "Smith") 

val instanceMirror = runtimeMirror.reflect(fred) 

val nameTerm = ru.typeOf[Person].declaration(ru.newTermName("name")).asTerm 

val nameLazy = instanceMirror.reflectField(nameTerm) 

nameLazy.get 
    >>> res8: Any = null 

fred.name 
    >>> res9: String = Fred Smith 

nameLazy.get 
    >>> res10: Any = Fred Smith 
+0

bu tembel ifadenin değerlendirmesini zorlar. scala'daki özellikleri bilmiyorum. –

+0

Bu noktada, sadece tembel val - a FieldMirror'a bir referansım var - bu yüzden bunu değerlendiremem. Get() işlevi ifadeyi döndürür ve sonra kolayca değerlendirebilirim. – vertexshader

cevap

6

Ben çözüm keşfettim. Oluşturulan gizli bir yöntem vardır:

case class Person(val firstName: String, 
       val lastName: String) { 
lazy val name = firstName + " " + lastName 
} 

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

val runtimeMirror = ru.runtimeMirror(getClass.getClassLoader) 

val fred = Person("Fred", "Smith") 

val instanceMirror = runtimeMirror.reflect(fred) 

val nameMethod = ru.typeOf[Person].member(ru.newTermName("name")).asMethod 
val nameValue = ru.typeOf[Person].member(ru.newTermName("name")).asTerm 

val nameLazy = instanceMirror.reflectField(nameValue) 
val nameLazyMethod = instanceMirror.reflectMethod(nameMethod) 

nameLazy.get 
    >>> null 

nameLazyMethod() 
    >>> res9: String = Fred Smith 

nameLazy.get 
    >>> res10: String = Fred Smith 
+0

Ayrıca "ru.typeOf [Kişi] .member (ru.newTermName (" name ")) .Tamamlayabilirsiniz. – ghik

İlgili konular