2014-11-18 4 views
0

У меня есть функция (вызывающая программа), которая возвращает определенные значения. Прежде чем они будут возвращены, они добавляются к результату вызова другой функции (вызываемого), есть ли более простой способ добавить возвращаемые значения функции вызываемой функции к возвращаемым значениям функции вызывающей функции до того, как они будут возвращены?Grails добавляет возвращаемые значения функции перед их возвратом

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] 
} 
+0

при условии, что funcB всегда возвращает коллекцию, вы можете просто использовать 'plus' для объединения двух коллекций. например 'return ([a] + funcB())' –

+0

@JoshuaMoore Но funcB возвращает два значения, и какой из них добавляется к вашему синтаксису? –

+0

В моем примере это взяло бы обе коллекции и объединило бы элементы для создания новой коллекции. '[1, 2, 3] == ([1] + [2, 3])' –

ответ

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]) 

Если вы используете проход л непосредственно (список списков) вместо а и Ь это должно также работать с более чем двумя элементами.

Смежные вопросы