【问题标题】:Groovy method with optional parameters带有可选参数的 Groovy 方法
【发布时间】:2013-08-11 12:40:28
【问题描述】:

我想为 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作为结果。 这可能吗(以最懒惰的方式)?

【问题讨论】:

    标签: groovy syntax optional-parameters


    【解决方案1】:

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

    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
    

    这样看起来更好看,这样做的好处是你可以随意改变参数的顺序。

    【讨论】:

      【解决方案2】:

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

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

      如果参数“可选”不存在,则转为“空”。

      【讨论】:

      • 这是他/她已经做过的。问题是只能省略最后一个具有默认值的参数。
      【解决方案3】:

      目前无法完成...代码

      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 中的内容以及默认值是留给读者的 ;-)

      【讨论】:

      猜你喜欢
      • 2012-09-16
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      相关资源
      最近更新 更多