将一个while循环转换为Coffeescript中的for循环

问题描述:

这看起来像一个简单的转换,但我似乎无法找到它的语法。将一个while循环转换为Coffeescript中的for循环

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

起点,终点和步骤是一个有符号整数

+0

如何分配“step”? – Lucero

+0

开始,结束和步骤是一个有符号整数 – yz10

+1

哦,“有符号整数”,正确。但那不是我的问题。如果'step'是'1','start'是'0'并且'end'是'0',那么你会以无限循环结束。所以在循环之前如何初始化它们并不重要,这对于转换代码可能很重要。 – Lucero

你应该阅读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); 
}` 
+0

即 而相当于(如果步骤> 0,那么I =结束) 但是,我需要 而(如果步骤> 0,那么我端) – yz10

+0

@ user842893 - 更改范围内的点。 [a..b]是包容性的,[a ... b]是排他性的。我会编辑。 –

+0

我只是想在while循环的清晰语法中对while循环进行精细控制。我不知道咖啡剧本是否允许。 – yz10

这可能会做你想要什么,假设你想要的号码从startend作为array可变项:

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