2014-07-14 3 views
0

Y a-t-il un nombre égal de blocs nommés dans Haxe (comme dans le Script Action 3)? Je ne sais pas si «bloc nommé» est le terme correct.Est-ce que Haxe a des blocs nommés ou similaires?

Étant donné l'exemple suivant (un exemple de base pour mettre en évidence un point):

singleCollision: { 
      for (teleport in teleports) { 
       if (overlap(player, teleport)) { 
        onTeleport(player, teleport); 
        break singleCollision; 
       } 
      } 

      for (chest in chests) { 
       if (overlap(player, chest)) { 
        onChest(player, chest); 
        break singleCollision; 
       } 
      } 

      for (shop in shops) { 
       if (overlap(player, shop)) { 
        onShop(player, shop); 
        break singleCollision; 
       } 
      } 
    } 

Si une collision se produit, briser le bloc et continuer. Je sais qu'il existe des alternatives telles que les fonctions en ligne, etc, mais plus curieux de savoir si Haxe supporte quelque chose de similaire.

Un bon exemple se trouve ici: http://jacksondunstan.com/articles/1228

Répondre

0

Il est généralement appelé étiquettes de code ou d'étiquettes GOTO.

Non, il n'y a rien de tel dans haxe. (Et dans certains de ses backends.)

Le code Spaghetty est considéré comme une mauvaise pratique depuis longtemps déjà. Utilisez des boucles conditionnées, elles sont beaucoup plus claires.

+0

Bien que je suis d'accord, il y a une place, surtout lorsque l'aplatissement code flèche http://blog.codinghorror.com/flattening- code-flèche /. Dans ce cas, je ne sais pas comment les boucles conditionnelles fonctionneraient, cela ne ferait que pousser la flèche vers la droite. – Chris

+0

@Chris Mais il n'y a rien dans cet article à propos des étiquettes de code. Et je doute qu'ils puissent résoudre le problème sans aller à l'enfer pur GOTO. En fait, la plupart de ces cas peuvent être résolus par une pensée intelligente dans mon expérience. Et si vous avez quelques endroits où vous avez vraiment besoin d'imbrication profonde - pourquoi pas, vous en avez vraiment besoin, n'est-ce pas? Et les opérations derrière le code seront suffisamment complexes pour justifier que le code soit légèrement plus complexe. Offtopic tho ... – stroncium

-1

Si vous utilisez try-catch, vous pouvez détecter une position de codebreak:

try { 
     for (teleport in teleports) { 
      if (overlap(player, teleport)) { 
       onTeleport(player, teleport); 
       throw 0; 
      } 
     } 

     for (chest in chests) { 
      if (overlap(player, chest)) { 
       onChest(player, chest); 
       throw 1; 
      } 
     } 

     for (shop in shops) { 
      if (overlap(player, shop)) { 
       onShop(player, shop); 
       throw 2; 
      } 
     } 
} 
catch(e:Dynamic) 
{ 
     switch (e) { 
      ... 
     } 
} 
+0

L'utilisation d'exceptions pour le contrôle de flux doit être considérée comme une mauvaise pratique: http://stackoverflow.com/questions/729379/why-not-use-exceptions-as-regular-flow-of-control –

+0

pas convaincu. J'ai testé mon code avec plusieurs boucles de longue durée dans un bloc try-catch sur la plateforme Neko, et la performance n'a pas changé. Je dirais: c'est une mauvaise idée de mettre un bloc try-catch à l'intérieur de la boucle, alors que la boucle à l'intérieur du try-catch ne fait pas une grande différence. Le lancer est sur (corrigez-moi si je me trompe): 1. positionner la pile dans le bloc catch 2. récupérer les registres précédents 3. passer l'objet thrown (qui peut être optimisé en tant qu'objet statique au lieu d'une nouvelle création). Si vous me demandez, il n'y a pas de vraie raison pour de mauvaises performances sur certaines machines virtuelles. – Vox

+0

Mais ce n'est pas le but: il est possible de faire la même chose en utilisant une fonction faisant un retour au lieu du lancer. Cependant, l'introduction de cette fonction peut être une mauvaise idée si le compilateur décide de faire une fonction locale qui fera une copie de toutes les variables externes utilisées dans une telle fonction sur le tas. – Vox

Questions connexes