使用scala宏更改变量时打印字符串

时间:2019-01-23 09:11:25

标签: scala scala-macros

如果我定义了变量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 :(得分:0)

使用普通var,您将无法做到。

您可以得到的最接近的方法是从外部创建一个看起来像var的getter-setter对:

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")

将打印新值。

请注意,setter是一个名为b_=的方法,Scala编译器对其进行了特殊处理-赋值Stuff.b = B("xxx")被自动转换为Stuff.b_=(B("xxx"))。仅在setter附带吸气剂的情况下才有效。