Ссылка на одну переменную из другой переменной в том же классе scala

#scala #lazy-loading

#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.запрос, подобный этому «Создан> = «2020-01-01″ И null».

Есть идеи, почему event_filter заполняется как null? Это потому, что переменные загружаются лениво?

Комментарии:

1. Потому что поля оцениваются по порядку. Самое простое решение — переместить event_filter раньше query .

2. Ах! имеет смысл. Спасибо.

3. другая возможность — использовать lazy val s

Ответ №1:

Как отмечалось в комментариях, это проблема с порядком инициализации. Вы можете исправить это, переупорядочив val s или создав первое значение 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
}