2011-11-14 23 views
35

Bu kod parçacığını buldum:.Delegate groovy ne demektir?

def say = {println m} 
say.delegate = [m:2] 
say() 

Bu, özellikle yazdırır 2. Nasıl çalışır? Xzx10 ile ilgili dokümanları nerede bulabilirim? Google beni .delegate'den bahsetmeyen Delege Dönüşümü sayfasına yönlendirdi.

+0

Ancak, google ikinci sayfasında bunun için belgeler var: http://groovy.codehaus.org/Closures#Closures-this%2Cowner%2Canddelegate. Bu yardımcı olur umarım. – Esailija

+2

http://mrhaki.blogspot.com/2009/11/groovy-goodness-setting-closures.html –

cevap

54

Kapağın temsilcisi, kapağın kendisinin içinde çözülemeyen başvuruları çözmek için kullanılan bir nesnedir. senin örneğin artık şöyle yazılmıştır ise: m kapanması içinde çözülebilir çünkü

def say = { 
    def m = 'hello' 
    println m 
} 
say.delegate = [m:2] 
say() 

O 'merhaba' yazdırır. Ancak, ne zaman m, kapak içindeki

def say = { 
    println m 
} 
say.delegate = [m:2] 
say() 

delegate tanımlanmamış başvuru çözümlemek için kullanılır ve bu durumda delegate kapanışları m 2.

+0

Kapatma için varsayılan parametreleri sağlamada kullanışlı bir yol: 'def say = {def m = m?: 'Merhaba' ; println m} ' – coderatchet

+2

@thenaglecode Bence bu ' kastediyorsunuz demek = {def m = bu ?: 'merhaba'; println m} ' –

11

Üç özelliğini eşleyen bir Map mesafesindedir Bu, sahibi vardır ve genel temsilci olarak, temsilci sahibine ayarlanır

def testClosure(closure) { 
    closure() 
} 
testClosure() { 
    println "this is " + this + ", super:" + this.getClass().superclass.name 
    println "owner is " + owner + ", super:" + owner.getClass().superclass.name 
    println "delegate is " + delegate + ", super:" + delegate.getClass().superclass.name 

    testClosure() { 
    println "this is " + this + ", super:" + this.getClass().superclass.name 
    println "owner is " + owner + ", super:" + owner.getClass().superclass.name 
    println "delegate is " + delegate + ", super:" + delegate.getClass().superclass.name 
    } 
} 

baskılar

this is [email protected], super:groovy.lang.Script 
owner is [email protected], super:groovy.lang.Script 
delegate is [email protected], super:groovy.lang.Script 
this is [email protected], super:groovy.lang.Script 
owner is [email protected], super:groovy.lang.Closure 
delegate is [email protected], super:groovy.lang.Closure 
+4

Varsayılan olarak sahip olabilirsiniz, ancak Groovy DSL'leri hangi sürücüye yüklerseniz temsilci herhangi bir nesneye yeniden atayabilir –