3

我从不喜欢newScala 中的运算符,尤其是 DSL。没有 构建对象的解决方法new通常非常难看。例如,如果你 import scala.actors.Actor._,你有actor { ... },但在 body 内部你不能访问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()
}

作为一个额外的挑战,如果doSomething是会发生什么protected

4

1 回答 1

2

我认为这行不通,因为

{
   text = "test"
   doSomething()
}

不会编译,因为在特征之外没有text也没有方法。宏目前只能作用于已经过类型检查的表达式。doSomething()Button

于 2012-08-26T12:39:25.483 回答