问题
这个问题的动机是试图为这个问题找到一个解决方案。
假设您想使用以下语法构建层次结构:
root {
subA {
subB("b1.1")
subB("b1.2")
}
}
构造 DSL 应该是类型安全的,也就是说,不能将 asubB
直接嵌套在 中root
,或者将 a 嵌套subA
在另一个 中subA
。因此,我的想法是有一个方法root
返回一个定义方法的对象subA
,而后者又返回一个定义的对象subB
。
我现在想要的是传递给的代码块root
,即
subA {
subB("b1.1")
subB("b1.2")
}
被执行使得 的调用subB
被绑定到由 . 创建的对象root
。基本上是这样的
root { r: Root =>
r.subA { sa: SubA =>
sa.subB("b1.1")
sa.subB("b1.2")
}
}
但不必使接收者r
和sa
明确的。
问题:this
在 Scala 中是否可以在代码块中重新绑定接收器,尤其是隐式接收器- 可能使用宏?
其他方法
本文描述了一个外观相似的 XML 树构造 DSL。它们的实现基于该Dynamic
特性,生成的 DSL 语法如下所示:
xml html {
xml head {
xml title "Search Links"
}
}
但是,这种方法需要显式的接收器(这里是 object xml
),更严重的是,我认为它不是类型安全的,因为它会静态地阻止您将html
节点嵌套在title
节点中。