2011-11-14 11 views
35

ho trovato questo frammento di codice:Cosa significa .delegate significa in groovy?

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

che stampa apperantly 2. Come funziona? Dove è possibile trovare documentazione su .delegate? Google mi ha condotto alla pagina Delegate Transformation che non menziona lo .delegate.

+0

La seconda pagina di google tuttavia dispone di documentazione per questo: http://groovy.codehaus.org/Closures#Closures-this%2Cowner%2Canddelegate. Spero che questo ti aiuti. – Esailija

+2

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

risposta

54

Il delegato di una chiusura è un oggetto utilizzato per risolvere riferimenti che non possono essere risolti all'interno del corpo della chiusura stessa. Se il vostro esempio è stato scritto così, invece:

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

Esso stampa 'ciao', perché m può essere risolto entro la chiusura. Tuttavia, quando m non è definito all'interno della chiusura,

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

il delegate viene utilizzato per risolvere il riferimento, e in questo caso la delegate è un Map che mappa m a 2.

+0

un modo pratico per fornire parametri predefiniti a una chiusura: 'def say = {def m = m?: 'Hello' ; println m} ' – coderatchet

+2

@thenaglecode Penso che intendessi questo ' def say = {def m = it?: 'ciao'; println m} ' –

11

Tre proprietà di chiusure , sono questo, il proprietario e delegare, In delegato generale è impostato al proprietario

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 
    } 
} 

stampe

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

Per impostazione predefinita può essere il proprietario, ma ciò che guida Groovy DSL è il fatto che è possibile riassegnare il delegato a qualsiasi oggetto –