Grails在返回函数之前添加函数的返回值

时间:2014-11-18 16:15:31

标签: grails groovy

我有一个返回特定值的函数(调用者)。在返回它们之前,它们是通过调用另一个函数(被调用者)的结果添加的,是否有更简洁的方法将被调用函数的结果值添加到调用函数的结果值之前返回?

def funcA() { // Caller Function
   def a,b,c
   a = blah
   b = blah blah
   ...
   def (d,e) = funcB()
   a += d // Is there a neater way to encapsulate 
   b += e // these additions somehow into the previous line? maybe kind of like
          // (a,b) += funcB() ?
   return [a,b,c]
}

def funcB() { // Callee Function
   def d,e
   ...
   return [d,e]
}

1 个答案:

答案 0 :(得分:0)

糟糕,我们没有zip,那么[a,b].zip()*.sum()之类的东西就可以了。

transpose()只给你一对(而不是余数)。所以这只有在您的列表长度相同的情况下才有效:

assert [43,668]==[[1,2,3],[42,666]].transpose()*.sum()

在这种情况下,可以尝试用零填充较短的列表,因此总和不受影响(此时这取决于那里的类型)。

所以这个功能是一个变通方法:

def zipadd(a,b) {
    def l = [a,b]
    // iterate over the size of the longer of the two lists
    (0..(l*.size().max()-1)).collect{
        // get the pairs, filter null, sum both
        l*.getAt(it).findAll{it!=null}.sum()
    }
}

assert [43,668,3]==zipadd([1,2,3],[42,666])
assert [43,668,3]==zipadd([42,666],[1,2,3])
assert [24,93,0,1]==zipadd([1,0,0,1], [23,93])

如果直接使用pass l(列表列表)而不是a和b,那么它也应该使用两个以上的元素。