宏采取类体,消除显式新运算符?

时间:2012-08-26 12:09:56

标签: scala macros new-operator scala-2.10

我从不喜欢Scala中的new运算符,特别是对于DSL。没有 new构造对象的解决方法通常都很难看。例如,如果您导入scala.actors.Actor._,则表示actor { ... },但在正文中您无法访问this: Actor,因此该对象中也存在各种伪实例方法,例如receivereactself

使用Scala 2.10宏,我想知道是否有机会让以下工作?

object Button {
  def apply(body: ? ): Button = macro applyImpl(body)
  def applyImpl(c: Context)(body: c.Expr[ ? ]): c.Expr[Button] = ?
}
trait Button {
  def text: String
  def text_=(s: String): Unit
  def doSomething(): Unit
}

Button {
  text = "test"
  doSomething()
}

作为一项额外挑战,如果doSomethingprotected会发生什么?

1 个答案:

答案 0 :(得分:2)

我认为这不会起作用,因为

{
   text = "test"
   doSomething()
}

不会编译,因为text特征之外没有doSomething()Button方法。宏当前只能处理已经被类型检查的表达式。