在 Coffeescript 中将 while 循环转换为 for 循环



这似乎是一个简单的转换,但我似乎找不到它的语法。

i = start
while(if step > 0 then i < end else i > end)
  array.push i
  i += step

开始、结束和步长是有符号整数

这可能会做你想要的,假设你想把从startend的数字作为array变量中的项目:

array = (i for i in [start...end])

您应该阅读有关循环的CofeeScript页面。 但是在 CoffeeScript 中做到这一点的方法是使用列表推导在一定范围内迭代:

(array.push i for i in [start...end] by step)

但请注意,列表推导式返回一个值。 例如,给定以下代码:

start = 10
end = 5
step = -2
array = []
(array.push i for i in [start...end] by step)

正如预期的那样,变量array以值 [10,8,6] 结束,但由于 push 返回它刚刚推送到的数组的新长度,最后一个语句的返回值 - 如果它是函数中的最后一件事,则会返回该值,或者如果您在 REPL 中输入上述内容,则会打印该值, 等 - 是[1, 2, 3].

编辑 因此,如下所述,最好首先使用列表理解来构造数组:

array = (i for i in [start...end] by step)

构建范围时,请注意,... 会根据正确的终结点生成一个独占范围,而..会生成一个包含范围。 因此,[1..5]列表中包括 5,而[1...5]则止步于 4。

此外,如果你真的发现自己需要 C 风格的 for 循环的灵活性,你总是可以在 CoffeeScript 中嵌入一些文字 JavaScript,方法是用反引号('...'

):
`for (i=start; (step > 0 && i < end) || (step < 0 && i > end); i+=step) {
     array.push(i);
 }`

最新更新