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
标签的描述很感兴趣。 :)
一个人应该问自己一个给定的结构是否非常可取。 while
和 do...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
-until
; do
-while
需要 break unless
。
loop
比while
级别低,不是吗?那个未链接的报价听起来不对。【参考方案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 的发送等效的内容?