2011-11-14 22 views
35

me encontré con este fragmento de código:¿Qué significa .delegate en groovy?

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

que imprime apperantly 2. ¿Cómo funciona? ¿Dónde puede encontrar documentación sobre .delegate? Google me llevó a la página de Transformación de delegados que no menciona .delegate en absoluto.

+0

La segunda página de Google sin embargo tiene documentación para ello: http://groovy.codehaus.org/Closures#Closures-this%2Cowner%2Canddelegate. Espero que esto ayude. – Esailija

+2

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

Respuesta

54

El delegado de un cierre es un objeto que se utiliza para resolver referencias que no se pueden resolver dentro del cuerpo del cierre en sí. Si el ejemplo se escribe así en su lugar:

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

Imprime 'hola', porque m pueden resolverse dentro del cierre. Sin embargo, cuando m no está definida dentro del cierre,

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

la delegate se utiliza para resolver la referencia, y en este caso el delegate es una Map que se asigna a m 2.

+0

una forma práctica de proporcionar parámetros por defecto para un cierre: 'def say = {def m = m?: 'Hello' ; println m} ' – coderatchet

+2

@thenaglecode Creo que se refería a esto ' def say = {def m = it?: 'hello'; println m} ' –

11

Tres propiedad de los cierres , son esto, propietario, y delegar, En delegado general se expone al propietario

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

impresiones

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

De forma predeterminada puede ser el propietario, pero lo que impulsa Groovy DSL es el hecho de que puede reasignar el delegado a cualquier objeto –