"Groovy in Action", gereğine göre, kapaklar çeşitli yollarla bildirilebilir. yollarından bir çift: def yazıcı = {hat -> println hat} def Kapanış GetPrinter() { dönüş {line -> println hat} }Oluklu kapatmalarda bulunanlar
kapatılmasıyla Closures, official documentationowner
göre
"doğrudan çevreleyen nesneyi iade et, bir kapat ya da bir sınıf." Her iki durumda da
class Mother { def prop = 'prop' def method(){ 'method' } Closure birth (param) { def local = 'local' def closure1 = { [ this, prop, method(), local, param ] } return closure1 } def birth2 = { param -> def local = 'local' def closure2 = { [ this, prop, method(), local, param ] } return closure2 } } Mother julia = new Mother() def closure = julia.birth('param') assert closure.owner == julia assert closure.delegate == julia def closure2 = julia.birth2('param') assert closure2.owner == julia assert closure2.delegate == julia
,
birth2
belgelere göre muhafazalardırbirth
ANB:
Tamam, bir göz atalım. Bu kapakların içinde closure1
ve closure2
bildiriyoruz. Onlara sadece onlara başvurmak için isimler verdim. Bu closure1
ve closure2
'un sahipleri birth
ve birth2
'a başvurmalıdır. Resmi belgelere göre. Ancak, ilk örnekte owner
, sınıf örneğine başvurur - julia
. İkinci örnekte, bunun birth2
'a atıfta bulunduğuna inanıyorum, ancak bunu nasıl kanıtlayacağımı bilmiyorum.
Farkı bilen var mı, lütfen?
farkı ile uzanan bir kapatma kısmının değil bir kapak, bir yöntemdir: Kapatma GetPrinter() {dönüş {hattı def - > println line}} bir yöntem değil, bir kapatma. Ve açık "Kapanış" bu durumda hiçbir şey ifade etmiyor mu? – Alexandr
Bu dönüş tipi. Yani bir kapanış döndüren bir yöntem. –
Like int int int (int a, int b) {a + b} 'iki virgül kabul eden ve int döndüren bir yöntemdir, 'Kapatma yöntemi (String a) {{-> a * 2}}' bir yöntemdir bir dizge alır ve bir Kapanış döndürür –