我从不喜欢Scala中的new
运算符,特别是对于DSL。没有 new
构造对象的解决方法通常都很难看。例如,如果您导入scala.actors.Actor._
,则表示actor { ... }
,但在正文中您无法访问this: Actor
,因此该对象中也存在各种伪实例方法,例如receive
,react
,self
等
使用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
会发生什么?
答案 0 :(得分:2)
我认为这不会起作用,因为
{
text = "test"
doSomething()
}
不会编译,因为text
特征之外没有doSomething()
和Button
方法。宏当前只能处理已经被类型检查的表达式。