69

我想为 web 服务编写一个包装器方法,该服务接受 2 个强制参数和 3 个可选参数。

为了有一个更简短的例子,我想让下面的代码工作

def myMethod(pParm1='1', pParm2='2') {
    println "${pParm1}${pParm2}"
}

myMethod();
myMethod('a')
myMethod(pParm2:'a') // doesn't work as expected
myMethod('b','c')

输出是:

12
a2
[pParm2:a]2
a2
bc

我想要实现的是给一个参数并得到1a结果。这可能(以最懒惰的方式)吗?

4

3 回答 3

91

不能按现状完成......代码

def myMethod(pParm1='1', pParm2='2'){
    println "${pParm1}${pParm2}"
}

基本上使 groovy 创建以下方法:

Object myMethod( pParm1, pParm2 ) {
    println "$pParm1$pParm2"
}

Object myMethod( pParm1 ) {
    this.myMethod( pParm1, '2' )
}

Object myMethod() {
    this.myMethod( '1', '2' )
}

一种替代方法是将可选的 Map 作为第一个参数:

def myMethod( Map map = [:], String mandatory1, String mandatory2 ){
    println "${mandatory1} ${mandatory2} ${map.parm1 ?: '1'} ${map.parm2 ?: '2'}"
}

myMethod( 'a', 'b' )                // prints 'a b 1 2'
myMethod( 'a', 'b', parm1:'value' ) // prints 'a b value 2'
myMethod( 'a', 'b', parm2:'2nd')    // prints 'a b 1 2nd'

显然,记录这一点以便其他人知道魔法中map发生了什么以及默认值是留给读者的;-)

于 2013-08-09T14:37:53.830 回答
41

您可以使用具有默认值的参数。

def someMethod(def mandatory,def optional=null){}

如果参数“可选”不存在,则变为“null”。

于 2014-02-26T00:55:36.323 回答
3

只是蒂姆答案的简化。正如已经建议的那样,执行此操作的常规方法是使用映射,但是然后让我们将强制参数也放入映射中。这将如下所示:

def someMethod(def args) {
    println "MANDATORY1=${args.mandatory1}"
    println "MANDATORY2=${args.mandatory2}"
    println "OPTIONAL1=${args?.optional1}"
    println "OPTIONAL2=${args?.optional2}"
}

someMethod mandatory1:1, mandatory2:2, optional1:3

输出:

MANDATORY1=1
MANDATORY2=2
OPTIONAL1=3
OPTIONAL2=null

这看起来更好,这样做的好处是您可以根据需要更改参数的顺序。

于 2020-12-07T17:16:05.043 回答