首页 > 解决方案 > 从同一 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 “Created >= “2020-01-01” AND null”。

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

标签: scalalazy-loading

解决方案


如评论中所述,这是初始化顺序的问题。您可以通过重新排序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
}

推荐阅读