2010-04-19 1 views
9

Existe-t-il un moyen d'utiliser des blocs de code anonymes dans Groovy? Par exemple, je suis en train de traduire le code Java suivant dans Groovy:Blocs de code anonymes dans Groovy

{ 
    int i = 0; 
    System.out.println(i); 
} 
int i = 10; 
System.out.println(i); 

La traduction la plus proche que je peux trouver est la suivante:

boolean groovyIsLame = true 
if (groovyIsLame) { 
    int i = 0 
    println i 
} 
int i = 10 
println i 

Je sais blocs de code anonymes sont souvent genre d'un antipattern. Mais avoir des variables avec des noms comme "inputStream0" et "inputStream1" est aussi un anti-modèle, donc pour ce code sur lequel je travaille, des blocs de code anonymes seraient utiles.

+1

Je ne sais pas groovy ne peut donc pas répondre à votre question directement, mais pourquoi ne pas Refactor votre code pour se débarrasser de vos blocs de code anonymes? Cela ressemble à un meilleur choix pour moi. –

Répondre

14

Vous pouvez utiliser des blocs de code anonymes dans Groovy mais la syntaxe est ambiguë entre ceux-ci et les fermetures. Si vous essayez d'exécuter ce que vous obtenez en fait cette erreur:

Ambiguous expression could be either a parameterless closure expression or an isolated open code block; solution: Add an explicit closure parameter list, e.g. {it -> ...}, or force it to be treated as an open block by giving it a label, e.g. L:{...} at line: 1, column: 1

Suite à la suggestion, vous pouvez utiliser une étiquette et il vous permettra d'utiliser le bloc de code anonyme. Réécriture votre code Java en Groovy:

l: { 
    int i = 0 
    println i 
} 
int i = 10 
println i 
+2

Eh bien, ce n'est pas "anonyme" –

+0

Merci, c'est un peu plus propre, et remplace l'inutile "sinon" par une étiquette inutile. Un peu plus concis. – piepera

+1

@Michael Si l'étiquette a été changé en anon: alors peut-être que personne ne le remarquera :) – crowne

1

Dans Groovy, ces accolades constituent un littéral de fermeture. Donc, non, peut le faire. Personnellement, je considérerais devoir abandonner les blocs anonymes pour obtenir des fermetures une très bonne affaire.

+0

Vous pouvez utiliser des blocs de code anonymes dans Groovy. Voir ma réponse pour les détails et l'exemple. –

2

Qu'en est-:

({ 
int i = 0 
println i 
}).() 

int i = 10 
println i 

Je n'ai pas une installation Groovy à portée de main, mais cela ne devrait le faire.

+0

Oui, cela fonctionne très bien. Le seul inconvénient lorsqu'on compare cela à la solution de Chris ci-dessus, c'est que la trace de la pile est un peu plus compliquée lorsqu'une exception se produit dans le bloc anonyme. Mais c'est une bonne solution aussi, merci! – piepera

+0

Vous pouvez également vous débarrasser du .call() et juste le remplacer par() –

+0

Je suis curieux, est-ce que '{int i = 0}.()' Fonctionne aussi? – OscarRyz

5
1.times { 
    // I'm like a block. 
} 
0

La nécessité la plus courante pour un bloc anonyme pour des liaisons supplémentaires (éventuellement ombrages) en utilisant def. Une option consiste à créer un dictionnaire équivalent de vos liaisons et utiliser .with. En utilisant l'exemple donné dans la question:

[i:0].with { 
    println i 
} 

int i = 10 
println i 

Cela vous donne un style Lisp let bloc

Questions connexes