Были ли циклы `dowhile` исключены из CoffeeScript?

В CoffeeScript цикл while входит в стандартную комплектацию:

while x()
   y()

Однако следующее1 не работает:

do
  y()
while x()

А это просто сахар для первого примера:

y() while x()

Есть ли в CoffeeScript встроенный цикл, который выполняется хотя бы один раз?

1Кроме того, do является ключевым словом — оно используется для вызова анонимных функций.


person ClosureCowboy    schedule 19.05.2011    source источник
comment
OT, но мне не понравилось описание тега coffeescript. :)   -  person Mateen Ulhaq    schedule 19.05.2011
comment
следует спросить себя, является ли данный конструкт вообще очень желательным. важное различие между while и do...while заключается в том, что тело цикла выполняется один раз, так как условие проверяется только после выполнения тела цикла. в CS вы можете легко сделать это, используя конструкцию do...break if... или do...break unless..., которая читается так же чисто и более гибка, поскольку break может встречаться в любой строке тела цикла. это также относится к подобным конструкциям, таким как repeat...until в паскале.   -  person flow    schedule 20.06.2013
comment
@flow do...break if... подвергается штрафу IIFE   -  person Pete Alvin    schedule 21.07.2015


Ответы (5)


В документации CoffeeScript говорится:

Единственный низкоуровневый цикл, который предоставляет CoffeeScript, — это цикл while.

Я не знаю встроенного цикла, который выполняется хотя бы один раз, поэтому я думаю, что альтернатива

loop
  y()
  break if x()
person Alex Korban    schedule 19.05.2011
comment
+1 Вот этого я и боялся. Быстрый поиск в Интернете показывает, что в нескольких блогах упоминается поддержка CoffeeScript циклов do-while, но эти блоги, безусловно, кажутся неверными. - person ClosureCowboy; 19.05.2011
comment
Обратите внимание, что это имитирует do-until; вам нужно break unless для do-while. - person matyr; 17.09.2011
comment
loop более низкий уровень, чем while, не так ли? Эта несвязанная цитата звучит неправильно. - person Cees Timmerman; 26.02.2016

Я знаю, что этот ответ очень старый, но, поскольку я вошел сюда через Google, я подумал, что это может сделать и кто-то другой.

Чтобы построить эквивалент цикла do...while в CoffeeScript, я думаю, что этот синтаксис эмулирует его лучше всего и проще всего и очень читаем:

while true
   # actions here
   break unless # conditions here
person adrenalin    schedule 20.06.2013
comment
while true можно записать как loop (и это более наглядно: вы строите цикл, и он не продолжается до тех пор, пока true) - person 1j01; 27.01.2015
comment
@ 1j01 Ретроспективно я согласен с тем, что loop семантически лучше после почти двух лет, но это альтернатива, и после написания моего JS с CoffeeScript в течение нескольких лет это все еще мой предпочтительный метод, вероятно, просто по привычке. - person adrenalin; 27.01.2015

Ваше предположение верно: в CoffeeScript нет эквивалента do-while. Таким образом, вы обычно пишете

y()
y() while x()

Если вы обнаружите, что делаете это часто, вы можете определить вспомогательную функцию:

doWhile = (func, condition) ->
  func()
  func() while condition()
person Trevor Burnham    schedule 19.05.2011
comment
Почему это больше loop; y(); break unless x();? - person Soumya; 28.06.2014
comment
Хороший вопрос. Я не видел, чтобы loop широко использовался в дикой природе, но это наиболее разумный вариант его использования. - person Trevor Burnham; 01.07.2014

Я обнаружил, что это можно сделать с помощью условия короткого замыкания:

flag = y() while not flag? or x()
person Community    schedule 18.07.2013

Я работаю над проектом, в котором я просто заставляю условие оцениваться в конце цикла, а затем завершаю его в начале.

# 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

Это не очень элегантно, но мешает вам определить новую функцию только для вашего блока кода while и запустить ее дважды. Как правило, существует способ кодирования операторов do...while, но для тех случаев, когда вы не можете, у вас есть простое решение.

person benja2729    schedule 27.02.2013
comment
do — зарезервированное слово в CoffeeScript. Это действительно смутило бы читателя. - person Mitar; 03.04.2013