web-dev-qa-db-fra.com

Les boucles "do ... while" étaient-elles exclues de CoffeeScript ...?

Dans CoffeeScript, la boucle while est standard:

while x()
   y()

Cependant, ce qui suit1 ne fonctionne pas:

do
  y()
while x()

Et ceci est tout simplement du sucre pour le premier exemple:

y() while x()

CoffeeScript est-il livré avec une boucle intégrée qui s'exécute au moins une fois?

1En passant, dois un mot-clé - il est utilisé pour appeler des fonctions anonymes.

53
ClosureCowboy

La documentation CoffeeScript dit:

La seule boucle de bas niveau fournie par CoffeeScript est la boucle while.

Je ne connais pas de boucle intégrée qui s'exécute au moins une fois, donc je suppose que l'alternative est

loop
  y()
  break if x()
67
Alex Korban

Je sais que cette réponse est très ancienne, mais depuis que je suis entré ici via Google, j'ai pensé que quelqu'un d'autre pourrait aussi bien.

Pour construire une boucle do ... while équivalente dans CoffeeScript, je pense que cette syntaxe l'émule la meilleure et la plus facile et qu'elle est très lisible:

while true
   # actions here
   break unless # conditions here
24
adrenalin

Votre supposition est correcte: il n'y a pas de do-while équivalent dans CoffeeScript. Donc, vous écriviez généralement

y()
y() while x()

Si vous faites cela souvent, vous pouvez définir une fonction d'aide:

doWhile = (func, condition) ->
  func()
  func() while condition()
16
Trevor Burnham

J'ai trouvé que cela pouvait être accompli grâce à un court-circuit conditionnel:

flag = y() while not flag? or x()
1
Sukima

J'ai travaillé sur un projet où je force simplement la condition à évaluer à la fin de la boucle, puis à terminer au début.

# set the 'do' variable to pass the first time
do = true
while do

  # run your intended code
  x()

  # evaluate condition at the end of
  # the while code block
  do = condition

# continue code

Ce n'est pas très élégant, mais cela vous empêche de définir une nouvelle fonction juste pour votre bloc de code while et de l'exécuter deux fois. Il existe généralement un moyen de coder autour des instructions do ... while, mais pour ces périodes où vous ne pouvez pas, vous avez une solution simple.

0
benja2729