J'ai du code Java qui utilise des accolades de deux manières
// Curly braces attached to an 'if' statement:
if(node.getId() != null)
{
node.getId().apply(this);
}
// Curly braces by themselves:
{
List<PExp> copy = new ArrayList<PExp>(node.getArgs());
for(PExp e : copy)
{
e.apply(this);
}
}
outAMethodExp(node);
Que signifient ces accolades bouclées autonomes après la première instruction if
?
Le seul but des accolades supplémentaires est de fournir une portée limitée. Le List<PExp> copy
n'existera qu'à l'intérieur de ces accolades et n'aura aucune portée en dehors.
Si c'est du code généré, je suppose que le générateur de code le fait pour qu'il puisse insérer du code (comme celui-ci) sans avoir à se soucier du nombre de fois qu'il a inséré un List<PExp> copy
et sans avoir à vous soucier de renommer éventuellement les variables si cet extrait est inséré plusieurs fois dans la même méthode.
J'appuie ce que matt b a écrit, et j'ajouterai qu'une autre utilisation que j'ai vue des accolades anonymes est de déclarer un constructeur implicite dans les classes anonymes. Par exemple:
List<String> names = new ArrayList<String>() {
// I want to initialize this ArrayList instace in-line,
// but I can't define a constructor for an anonymous class:
{
add("Adam");
add("Eve");
}
};
Certains frameworks de tests unitaires ont pris cette syntaxe à un autre niveau, ce qui permet à certaines choses lisses qui semblent totalement incompilables de fonctionner. Puisqu'ils regardez peu familiers, je ne suis pas moi-même un grand fan, mais cela vaut la peine de reconnaître au moins ce qui se passe si vous rencontrez cette utilisation.
Je suis d'accord avec la réponse relative à la portée limitée, mais j'ajouterais une chose.
Parfois, vous voyez une construction comme celle-ci dans le code des personnes qui aiment plier des sections de leur code et qui ont des éditeurs qui plieront automatiquement les accolades. Ils l'utilisent pour replier leur code dans des sections logiques qui ne tombent pas dans une fonction, une classe, une boucle, etc. qui seraient généralement repliées.
Je suppose que quelqu'un a oublié une déclaration else.
Il y a rarement une bonne raison de s'embêter à créer des étendues de bloc supplémentaires. Dans ce cas, et dans la plupart des cas, il est beaucoup plus probable que quelqu'un ait oublié de taper sa déclaration de contrôle que de faire quelque chose d'intelligent.
Ils font une portée intérieure. La variable déclarée à l'intérieur de ces accolades n'est pas visible à l'extérieur d'eux. Cela s'applique également à C/C++.
Il est également utilisé pour blocs d'initialisation .
Les accolades sont également utiles pour réduire la portée des instructions switch/case.
switch(foo) {
case BAR:
int i = ...
...
case BAZ:
int i = ... // error, "i" already defined in scope
}
Mais tu peux écrire
switch(foo) {
case BAR:{
int i = ...
...
}
case BAZ:{
int i = ... // OK
}
}
Remarque intéressante: les accolades permettent en fait une classe d'instructions: les déclarations.
C'est illégal: if(a) int f;
mais c'est légal: if(a) { int f; }
Je pense qu'ils définissent simplement un niveau de portée sans nom.
Ils définissent une nouvelle portée qui signifie que tout ce qui est déclaré dans cette portée n'est pas visible en dehors des accolades.
Le apporter une portée, copie ne sera pas visible en dehors de celui-ci, vous pouvez donc déclarer une autre variable avec le même nom plus tard. Et il peut être récupéré par le garbage collector juste après avoir quitté cette étendue. Dans ce cas copie sert de variable temporaire, c'est donc un bon exemple.