Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从同一scala类中的另一个变量引用一个变量_Scala_Lazy Loading - Fatal编程技术网

从同一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

我有一个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且为空


知道为什么事件过滤器被填充为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
}