第一刀: 命名参数
groovy中的参数列表可以被命名, 明明有啥好处呢? 初步来看就是你不需要记住参数的顺序了
def foo(param) { println "${param.a}, ${param.b}, ${param.c}" } foo a:1, b:2, c:3 foo b:2, c:3, a:1 //跟上面一句的调用结果是相同的
然而还不止如此, groovy甚至比你想象的更聪明
def bar(p1, p2, p3) { assert p1.a == 1 assert p1.b == 2 assert p1.c == 3 assert p2 == "p2" assert p3 == "p3" println "success" } bar "p2","p3", a:1, b:2, c:3 bar a:1, b:2, c:3, "p2","p3" bar a:1, b:2, "p2", c:3, "p3" //上面三行的调用结果都是一样的
正如你所看到的, groovy能够自动的匹配参数, 会把a:1, b:2, c:3 组合起来赋给p1, 利用这点我们就能够写出"优雅"的函数了
比如我们定义这样一个"转账"的函数
def transfer(transaction, amount) { println """ Transfering ${amount} from ${transaction.from} to ${transaction.to} """ } transfer 100, from: "alex", to: "tutu" //这样的调用很有点dsl的味道了吧
再比如下面这个函数, 它的作用是发送一条消息给某个人
def sendMessage(receiver, message) { println "sending ${message} to ${receiver}" }
对应的调用方式是这样的
sendMessage "alex", "a message"
看起来貌似没啥不好, 但如果想要更加dsl一些的话, 就可以写成这个样:
def sendMessage1(receiver, message) { println "sending ${message} to ${receiver.to}" } sendMessage1 "You're welcome!", to: "Alex" //这样就不需考虑参数顺序了
looks better , ha?