2011-05-19 10 views
52

En CoffeeScript, el bucle while viene de serie:¿Los lazos `do ... while` quedaron fuera de CoffeeScript ...?

while x() 
    y() 

Sin embargo, los siguientes no funciona:

do 
    y() 
while x() 

Y esto no es más que el azúcar para el primer ejemplo:

y() while x() 

¿CoffeeScript viene con un bucle incorporado que se ejecuta al menos una vez?

Como acotación al margen, do es una palabra clave - se usa para llamar a funciones anónimas.

+7

OT, pero me detuve en la descripción de la etiqueta 'coffeescript'. :) –

+0

uno debe preguntarse si una construcción dada es muy deseable en absoluto. la distinción importante entre 'while' y' do ... while' es que el cuerpo del lazo se ejecuta una vez, ya que la condición solo se verifica una vez que se ha ejecutado el cuerpo del ciclo. en CS puedes hacerlo fácilmente usando un 'do ... break if ...' o 'do ... break a menos que ...'constructo que se lee igual de limpio y * es más flexible * ya que el' break' puede ocurrir en cualquier línea del cuerpo del ciclo. esto también se aplica a construcciones similares como 'repeat ... until' de pascal. – flow

+0

@flow 'do ... break if ...' incurre en penalización IIFE –

Respuesta

63

La documentación CoffeeScript dice:

El único lazo de bajo nivel que proporciona CoffeeScript es el bucle while.

no sé de un sistema incorporado en bucle que se ejecuta al menos una vez, así que supongo que la alternativa es

loop 
    y() 
    break if x() 
+0

+1 Eso es lo que temía. Una rápida búsqueda web revela que varios blogs mencionan el soporte de CoffeeScript para los bucles "do-while", pero esos blogs ciertamente parecen estar equivocados. – ClosureCowboy

+22

Tenga en cuenta que esto simula 'do'-'until'; necesitas 'romper a menos' para' do'-'while'. – matyr

+0

[enlace a la documentación de los bucles] (http://coffeescript.org/#loops) – reergymerej

16

Su conjetura es correcta: No hay equivalente en do-while CoffeeScript. Por lo que habitualmente se escribe

y() 
y() while x() 

Si usted se encuentra haciendo esto a menudo, es posible definir una función auxiliar:

doWhile = (func, condition) -> 
    func() 
    func() while condition() 
+2

¿Por qué este over' loop? y(); romper a menos que x(); '? – Soumya

+0

Buena pregunta. No he visto 'loop' usado mucho en la naturaleza, pero este es el caso de uso más sensato para él. –

0

He estado trabajando en un proyecto en el que simplemente forzar la situación a evaluar al final del ciclo, luego terminar al comienzo.

# 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 

No es muy elegante, pero sí a evitar que la definición de una nueva función sólo para su bloque de código mientras y ejecutarlo dos veces. En general, hay una forma de codificar las sentencias do ... while, pero para aquellos tiempos que no puede tener una solución simple.

+16

'do' es una palabra reservada en CoffeeScript. Esto realmente confundiría al lector. – Mitar

24

Sé que esta respuesta es muy antigua, pero desde que entré aquí a través de Google, pensé que otra persona también podría hacerlo.

Para construir un do ... mientras equivalente bucle en CoffeeScript creo que esta sintaxis emula el mejor y más fácil y es muy fácil de leer:

while true 
    # actions here 
    break unless # conditions here 
+6

'while true' se puede escribir como' loop' (y es más descriptivo: estás construyendo un loop, y no continúa mientras 'true') – 1j01

+2

@ 1j01 Retrospectivamente estoy de acuerdo en que' loop' es semánticamente mejor después de casi dos años, pero esta es una alternativa y después de escribir mi JS con CoffeeScript durante algunos años sigue siendo mi método preferido, probablemente por puro hábito. – adrenalin

+0

........... k :) – 1j01

1

He encontrado esto podría lograrse a través de un cortocircuito condicional :

flag = y() while not flag? or x() 
Cuestiones relacionadas