Могу ли я проверить, оценивался ли ленивый вал в Scala?
Например, в методе toString
я хотел бы предоставить информацию о том, был ли оценен ленивый член val класса, и если да, напечатайте его значение. Возможно ли это?
Ответы
Ответ 1
Насколько я знаю, вы не можете. Но вы можете помочь с этим:
class A {
var isMemberSet = false
lazy val member = { isMemberSet = true; 8 }
}
val a = new A
a.isMemberSet // false
a.member // 8
a.isMemberSet // true
Конечно, модификатор видимости и доступа должен быть адаптирован.
Ответ 2
Если вы хотите получить прямой доступ к генерируемому компилятором полем, попробуйте следующий код.
import java.lang.reflect._
class A {
lazy val member = 42
def isEvaluated =
(1 & getClass.getField("bitmap$0").get(this).asInstanceOf[Int]) == 1
}
val a = new A
println(a.isEvaluated) // => true
println(a.member)
println(a.isEvaluated) // => false
Ответ 3
Я также счел полезным проверить, действительно ли ленивое значение оценивается в некоторых сложных ситуациях.
И это общий класс, который вы могли бы использовать:
class ExtraLazy[T](notYetEvaluatedValue: => T) {
var isSet = false;
lazy val value: T = {
Logger("lazy value being evaluated");
isSet = true;
notYetEvaluatedValue;
}
}