【问题标题】:groovy: how to pass varargs and closure in same time to a method?groovy:如何将可变参数和闭包同时传递给方法?
【发布时间】:2015-02-08 23:24:19
【问题描述】:

给定以下常规功能:

def foo(List<String> params, Closure c) {...}

方法调用是:

foo(['a', 'b', 'c']) { print "bar" }

但我想去掉函数调用中的括号(列表)。类似:

foo('a', 'b') { print "bar" }

我无法将列表参数更改为可变参数,因为可变参数只能是函数中的最后一个参数(这里的闭包是最后一个参数)。

有什么建议吗?

【问题讨论】:

    标签: groovy closures


    【解决方案1】:

    看到不可能完全实现您想要的(它在 Groovy 文档中写到您的具体案例是一个问题,不幸的是他们正在迁移文档,所以我现在无法直接链接),那么这些方面的内容呢:

    def foo(String... params) {
        println params
        return { Closure c ->
            c.call()
        }
    }
    
    foo('a', 'b') ({ println 'woot' })
    

    现在你需要把闭包放在括号中,但你不需要再使用数组了..

    【讨论】:

      【解决方案2】:

      总是有穷人的 Varargs™

      def foo(String p1,                                  Closure c) {foo [p1],             c}
      def foo(String p1, String p2,                       Closure c) {foo [p1, p2],         c}
      def foo(String p1, String p2, String p3,            Closure c) {foo [p1, p2, p3],     c}
      def foo(String p1, String p2, String p3, String p4, Closure c) {foo [p1, p2, p3, p4], c}
      ...
      

      我只是在开玩笑。

      【讨论】:

        【解决方案3】:

        我认为这只有在您使用数组作为参数或Variable-Length Argument List 时才有可能:

        def foo(Object... params) {
            def closureParam = params.last()
            closureParam()
        }
        
        foo('a', 'b') { print "bar" }
        

        【讨论】:

        • 这是我倾向于避免的解决方案,因为我将无法再控制参数类型。可以发送整数或其他对象而不是字符串。
        • @mhshams 您可以使用String... strings varargs 进行控制
        • nm,我想我现在明白您需要 Closure c 作为最终参数。
        • foo(def... params) 会让它看起来比 Java 风格更 Groovy,如果你不得不求助的话。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多