2012-05-08 26 views
6

Bir listenin olması ve bunun yerine birkaç değişkene sahip bir kapatma imzası için argüman olarak kullanılması mümkün müdür? Bunun nedeni, java kodundan bir kapatma çağırmam gerekmesi ve java kodunun groovy closure'un hangi değişkenlere ihtiyacı olduğunu bilmemesi.Groovy - listeyi kapanış argümanlarına genişletiyor

Bu örnekle daha iyi sunulur.

Her kapağın farklı imzaları olabileceği bir 'kapanış deposu' var mı? EG:

closures = [ 
    closureA: { int a, String b -> 
     a.times { 
      System.err.println(b); 
     } 
    }, 
    closureB: { int a, int b, String c -> 
     (a+b).times { 
      System.err.println(c); 
     } 
    } 
] 

O zaman bu kapanışları aramaya benim java koduna açığa ediyorum bir yöntem var:

def tryClosureExpansion(String whichClosure, Object ... args) { 
    def c = closures[whichClosure] 
    c.call(args)  // DOESNT COMPILE ! 
} 

Ve Java Böyle bu yöntemi derim:

// these calls will happen from Java, not from Groovy 
tryClosureExpansion("closureA", 1, "Hello"); 
tryClosureExpansion("closureB", 1, 5, "Hello more"); 

Derleme olmayan satırlarda yukarıya bakın. Kendimi böyle bir şeyle başa çıkacak kadar 'mükemmel' gibi hissediyorum. Uçabilecek herhangi bir alternatif var mı?

cevap

9

mu:

c.call(*args) 

Work? Test etmek için bilgisayar atm'sinde değil

+2

Çalışmalı. Ayrıca, sadece yöntem çağrısı sözdizimi kullanılarak da çalışılmalıdır: 'c (* args)'; ama 'call' yönteminden faydalanabilirsiniz ve güvenli navigasyon operatörünü kullanabilirsiniz, eğer kapak mevcut değilse:' c? .call (* args) '(tabii ki, bu tasarımınıza bağlıdır, belki de bir istisna atıyor olabilir bu durumda daha iyi bir fikir olabilir). – epidemian

+0

Teşekkürler Tim, bunu yaptı. Bunun nerede belgelendiğini merak ediyorum? Operatörler ve Koleksiyonlar sayfalarını kontrol ettim ve yayılma operatöründen bahsettiler, ancak bu listede bir eylem belirtmediğinden biraz farklı. @epidemian - teşekkürler, aslında bu çağrıyı kontrol edip bir istisna atarım. –

+2

@RoyTruelove Bu, 'Spread Operator' olarak adlandırılır. Bir COllection'da birden çok girdiye bir şey uygulamak için kullanılır veya bu durumda listeyi [çoklu parametrelere] genişletir (http://jroller.com/aalmiray/entry/another_gem_from_groovy) –