38 votes

Que signifie .delegate dans groovy?

J'ai trouvé cet extrait de code:

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

Cela apperantly 2. Comment ça marche? Où trouver de la documentation sur .delegate ? Google m'a conduit à la page de transformation des délégués qui ne mentionne absolument pas .delegate .

59voto

Dónal Points 61837

Le délégué de la fermeture est un objet qui est utilisé pour résoudre les références qui ne peuvent être résolus à l'intérieur du corps de la fermeture elle-même. Si votre exemple a été écrit comme ceci à la place:

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

Il imprime "bonjour", car m peut être résolu à l'intérieur de la clôture. Toutefois, lorsque m n'est pas définie à l'intérieur de la clôture,

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

l' delegate est utilisé pour résoudre la référence, et dans ce cas, l' delegate est Map les cartes, m de 2.

12voto

anish Points 919

Trois propriétés des fermetures, propriétaire, et délégué . En général, délégué est défini sur propriétaire.

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

empreintes

 this is ConsoleScript0@11d20d3, super:groovy.lang.Script
owner is ConsoleScript0@11d20d3, super:groovy.lang.Script
delegate is ConsoleScript0@11d20d3, super:groovy.lang.Script
this is ConsoleScript0@11d20d3, super:groovy.lang.Script
owner is ConsoleScript0$_run_closure1@caea19, super:groovy.lang.Closure
delegate is ConsoleScript0$_run_closure1@caea19, super:groovy.lang.Closure
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X