从同一scala类中的另一个变量引用一个变量
我有一个scala类,如下所示从同一scala类中的另一个变量引用一个变量,scala,lazy-loading,Scala,Lazy Loading,我有一个scala类,如下所示 class Event { val query: String = s""" | Created >= "2020-01-01" AND ${event_filter} | """ .stripMargin val event_filter: String
class Event {
val query: String =
s"""
| Created >= "2020-01-01" AND ${event_filter}
| """
.stripMargin
val event_filter: String =
s"""
| event= 'CreateTask'
| """
.stripMargin
}
然后我有一个下面的测试类来测试事件查询
class EventTest extends FunSuite{
test ("testing event query") {
val obj:Event = new Event()
assert(obj.query == "Created >= \"2020-01-01\" AND event= \"CreateTask\" ")
}
}
在运行测试用例时,我得到了实际值和预期值之间的不匹配。我得到这样的obj.query,创建>=2020-01-01且为空
知道为什么事件过滤器被填充为null吗?是因为变量被延迟加载吗?如注释中所述,这是初始化顺序的问题。您可以通过对val重新排序或将第一个值设为lazy val来解决此问题,以便在第一次使用val之前(第二个值初始化之后)不会对其进行计算
class Event {
val event_filter: String =
s"""
| event= 'CreateTask'
| """
.stripMargin
val query: String =
s"""
| Created >= "2020-01-01" AND ${event_filter}
| """
.stripMargin
}
或
因为字段是按顺序计算的。最简单的解决方法是在查询之前移动事件过滤器。啊!有道理。谢谢。另一种可能是使用惰性VAL
class Event {
lazy val query: String =
s"""
| Created >= "2020-01-01" AND ${event_filter}
| """
.stripMargin
val event_filter: String =
s"""
| event= 'CreateTask'
| """
.stripMargin
}