将一个while循环转换为Coffeescript中的for循环
问题描述:
这看起来像一个简单的转换,但我似乎无法找到它的语法。将一个while循环转换为Coffeescript中的for循环
i = start
while(if step > 0 then i < end else i > end)
array.push i
i += step
起点,终点和步骤是一个有符号整数
答
你应该阅读CofeeScript page on loops。但在CoffeeScript中要做到这一点的方法是使用list comprehension迭代一个范围:
(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
循环的灵活性,你总是可以嵌入一些文字中的JavaScript功能的CoffeeScript通过在其包装反引号(`...`):
`for (i=start; (step > 0 && i < end) || (step < 0 && i > end); i+=step) {
array.push(i);
}`
答
这可能会做你想要什么,假设你想要的号码从start
到end
作为array
可变项:
array = (i for i in [start...end])
如何分配“step”? – Lucero
开始,结束和步骤是一个有符号整数 – yz10
哦,“有符号整数”,正确。但那不是我的问题。如果'step'是'1','start'是'0'并且'end'是'0',那么你会以无限循环结束。所以在循环之前如何初始化它们并不重要,这对于转换代码可能很重要。 – Lucero