печатать строку всякий раз, когда переменная изменяется макросом scala - PullRequest
0 голосов
/ 23 января 2019

Если я определил переменную b val b:B. Можно ли напечатать значение b каждый раз, когда b назначается новое значение. Как код ниже:

  case class B(name:String) {
  }

  var b = B("123")
  b = B("xxx")
  println(s"b is changed to $b")

  b = B("xxJJx")
  println(s"b is changed to $b")

Я надеюсь, что код println(s"b is changed to $b") будет скрыт в каком-то макросе при создании B или b, например:

var b = macro_wrap(B("123"))

1 Ответ

0 голосов
/ 25 января 2019

С простым var вы не можете сделать это.

Самое близкое, что вы можете получить, это создать пару геттер-сеттер, которая будет выглядеть как var снаружи:

object Stuff {
  private var b0 = B("123")
  def b: B = b0
  def b_=(newb: B): Unit = {
    b0 = newb
    println(s"b is changed to $newb")
  }
}

Тогда:

Stuff.b = B("xxx")

Напечатает новое значение.

Обратите внимание, что сеттер - это метод с именем b_=, который несколько специально обрабатывается компилятором Scala - присваивание Stuff.b = B("xxx") автоматически переводится в Stuff.b_=(B("xxx")). Это работает, только если сеттер сопровождается геттером.

...