📅  最后修改于: 2020-11-04 06:49:14             🧑  作者: Mango
Groovy允许省略对顶级语句的方法调用的参数周围的括号。这就是所谓的“命令链”功能。此扩展的工作方式是允许一个人链接这样的无括号的方法调用,既不需要参数周围的括号,也不需要链接的调用之间的点。
如果调用以abcd执行,则实际上等同于a(b).c(d) 。
DSL或特定于域的语言旨在简化以普通用户易于理解的方式用Groovy编写的代码。下面的示例显示具有域特定语言的确切含义。
def lst = [1,2,3,4]
print lst
上面的代码显示了使用println语句打印到控制台的数字列表。在特定领域的语言中,命令将为-
Given the numbers 1,2,3,4
Display all the numbers
因此,上面的示例显示了编程语言的转换,以满足领域特定语言的需求。
让我们看一下如何在Groovy中实现DSL的简单示例-
class EmailDsl {
String toText
String fromText
String body
/**
* This method accepts a closure which is essentially the DSL. Delegate the
* closure methods to
* the DSL class so the calls can be processed
*/
def static make(closure) {
EmailDsl emailDsl = new EmailDsl()
// any method called in closure will be delegated to the EmailDsl class
closure.delegate = emailDsl
closure()
}
/**
* Store the parameter as a variable and use it later to output a memo
*/
def to(String toText) {
this.toText = toText
}
def from(String fromText) {
this.fromText = fromText
}
def body(String bodyText) {
this.body = bodyText
}
}
EmailDsl.make {
to "Nirav Assar"
from "Barack Obama"
body "How are things? We are doing well. Take care"
}
当我们运行上面的程序时,我们将得到以下结果-
How are things? We are doing well. Take care
关于上述代码实现,需要注意以下几点:
使用接受闭包的静态方法。这主要是实现DSL的简便方法。
在电子邮件示例中,类EmailDsl具有make方法。它创建一个实例,并将闭包中的所有调用委托给该实例。这是“ to”和“ from”部分最终在EmailDsl类内部执行方法的机制。
调用to()方法后,我们会将文本存储在实例中以供以后格式化。
现在,我们可以使用一种易于理解的语言来调用EmailDSL方法,该语言对于最终用户来说很容易理解。