Groovy champ d'application - comment accéder à la variable de script dans une méthode
J'ai une question sur les règles de portée en Groovy. Dans l'extrait suivant, j'ai trois variables, a
a une portée locale, b
a un script portée, et c
devriez obtenir script de la portée de l'aide de l' @Field
annotation.
#!/usr/bin/groovy
import groovy.transform.Field;
//println org.codehaus.groovy.runtime.InvokerHelper.getVersion()
def a = 42;
b = "Tea"
@Field def c = "Cheese"
void func()
{
//println a //MissingPropertyException
println b //prints "Tea"
println c //prints "Cheese" with groovy 2.1.2, MissingPropertyException with groovy 1.8.6
}
class Main
{
def method()
{
//println a //MissingPropertyException
//println b //MissingPropertyException
//println c //MissingPropertyException with both 1.8.6. and 2.1.2
}
}
func();
new Main().method();
- Je obtenir MissingPropertyException
s sur les lignes indiquées avec des commentaires. Les exceptions à la a
sont attendus, que cette variable a une portée locale. Mais je m'attends b
pour être accessible à l'intérieur de method()
- il n'est pas.
@Field
ne pas faire n'importe quoi en groovy 1.8.6, même après la mise à niveau, il fonctionne, donc je suppose que c'est un vieux bug. Néanmoins, c
est inaccessible à l'intérieur de method()
avec la version.
Donc mes questions sont:
- Pourquoi ne puis-je pas accéder à une variable annoté avec
@Field
à l'intérieur
method()
? - Comment puis-je me référer à une variable de script à l'intérieur de
method()
?
Vous devez vous connecter pour publier un commentaire.
Lorsque vous avez des méthodes ou des déclarations en dehors d'un
class
la déclaration dans un script groovy, un accord implicite de la classe est créée. Pour répondre à vos questions:Dans votre exemple,
func()
pouvez accéder au champc
parce qu'ils sont à la fois membres de l'implicite de la classe. LeMain
classe n'est pas, donc il ne peut pas.Vous avez besoin pour passer une référence à la variable de script pour
method()
. Une façon est de passer le définit implicitementbinding
objet, à travers lequel vous pouvez accéder à tous les script de la portée des variables.Exemple:
Ce script et
Main
sont générés en deux classes distinctes à l'intérieur du même fichier.Comme
Main
n'est pas une classe interne du Script de la classe, il ne peut pas voir lajava.lang.Object c
champ à l'intérieur du script de classe.Vous devez explicitement envelopper ce script dans une classe avec un
static main( args )
méthode (et une interneMain
classe) ou vous auriez besoin de passer une instance du script de la classe de la méthode comme:Main.method( this )
C'est le genre de chose que le script ci-dessus génère:
func()
"voir"b
? Estb
aussi une propriété du Script de la classe?