CoffeeScript 中是不是遗漏了 `do...while` 循环...?

Posted

技术标签:

【中文标题】CoffeeScript 中是不是遗漏了 `do...while` 循环...?【英文标题】:Were `do...while` loops left out of CoffeeScript...?CoffeeScript 中是否遗漏了 `do...while` 循环...? 【发布时间】:2011-08-28 12:27:12 【问题描述】:

在 CoffeeScript 中,while 循环是标准的:

while x()
   y()

但是,以下1 不起作用:

do
  y()
while x()

这只是第一个例子的糖:

y() while x()

CoffeeScript 是否带有至少执行一次的内置循环?

1顺便说一句,do 一个关键字——它用于调用匿名函数。

【问题讨论】:

OT,但我对coffeescript 标签的描述很感兴趣。 :) 一个人应该问自己一个给定的结构是否非常可取。 whiledo...while 之间的重要区别是循环体执行一次,因为条件仅在循环体执行后检查。在 CS 中,您可以使用 do...break if...do...break unless... 结构轻松做到这一点,它们的读取方式一样干净且 更灵活,因为break 可以出现在循环体中的任何行上。这也适用于类似的结构,如帕斯卡的repeat...until @flow do...break if... 招致 IIFE 惩罚 【参考方案1】:

CoffeeScript 文档说:

CoffeeScript 提供的唯一低级循环是 while 循环。

我不知道至少执行一次的内置循环,所以我想替代方案是

loop
  y()
  break if x()

【讨论】:

+1 这就是我所担心的。快速的网络搜索显示有几个博客提到 CoffeeScript 对“do-while”循环的支持,但这些博客显然是错误的。 请注意,这模拟了do-untildo-while 需要 break unless loopwhile 级别低,不是吗?那个未链接的报价听起来不对。【参考方案2】:

您的猜测是正确的:CoffeeScript 中没有 do-while 等价物。所以你通常会写

y()
y() while x()

如果你发现自己经常这样做,你可以定义一个辅助函数:

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

【讨论】:

为什么会超过loop; y(); break unless x(); 好问题。我还没有看到loop 在野外被大量使用,但这是它最明智的用例。【参考方案3】:

我一直在做一个项目,我只是强制条件在循环结束时评估,然后在开始处终止。

# 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 语句进行编码,但是对于那些你不能有一个简单的解决方案的时候。

【讨论】:

do 是 CoffeeScript 中的保留字。这真的会让读者感到困惑。【参考方案4】:

我知道这个答案很老了,但是由于我是通过谷歌进入这里的,我想其他人也可以。

要在 CoffeeScript 中构造一个等效的 do...while 循环,我认为这种语法是最好的和最简单的,并且可读性很好:

while true
   # actions here
   break unless # conditions here

【讨论】:

while true 可以写成loop (并且更具描述性:你正在构建一个循环,它不会继续只要true @1j01 回想起来,我同意loop 在近两年后语义上更好,但这是一个替代方案,在用 CoffeeScript 编写我的 JS 几年后,它仍然是我的首选方法,可能只是出于习惯。【参考方案5】:

我发现这可以通过短路条件来实现:

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

【讨论】:

以上是关于CoffeeScript 中是不是遗漏了 `do...while` 循环...?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript/Coffeescript/jQuery 中是不是有与 Ruby 的发送等效的内容?

Ruby 哈希是不是可以包含在 Sass 和 CoffeeScript 中,从而允许共享数据?

CoffeeScript 是不是支持单引号字符串中的插值?

coffeescript 函数 箭头表达式

CoffeeScript 转换代码是不是错误?

在 CoffeeScript 中,如何将值附加到数组?