从同一scala类中的另一个变量引用一个变量



我有一个类似的scala类


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";AND null";。

知道为什么event_filter被填充为null吗?是因为变量被延迟加载吗?

如注释中所述,这是初始化顺序的问题。您可以通过重新排序vals或使第一个值为lazy val来解决此问题,以便在第一次使用之前(也就是在初始化第二个值之后(不对其进行求值。

class Event {
val event_filter: String =
s"""
|  event= 'CreateTask'
|  """
.stripMargin
val query: String =
s"""
| Created >= "2020-01-01" AND ${event_filter}
|  """
.stripMargin
}

class Event {
lazy val query: String =
s"""
| Created >= "2020-01-01" AND ${event_filter}
|  """
.stripMargin
val event_filter: String =
s"""
|  event= 'CreateTask'
|  """
.stripMargin
}

最新更新