2013-02-20 66 views
3

我是CoffeeScript的新手,已经阅读了这本书,The Little Book on CoffeeScript。以下是本书第2章中的几行,它使我在阅读时感到困惑:CoffeeScript中的循环

CoffeeScript公开的唯一低级循环是while循环。这与纯JavaScript中的while循环具有相似的行为,但具有额外的优势,即返回结果数组,即Array.prototype.map()函数。

num = 6 
minstrel = while num -= 1 
    num + " Brave Sir Robin ran away" 

虽然它可能看起来很好的一个程序员的CoffeeScript,作为一个新手,我无法理解的代码做什么。此外,单词返回一个结果数组似乎并没有与一个循环结构而不是一个函数一起使用。所以它的概念返回东西似乎令人困惑。此外,在循环的每次迭代中,具有字符串"Brave Sir Robin ran away"的变量num似乎很尴尬,因为值num被用作循环计数器。

如果你能解释代码的行为,并且可能用更简单的例子来说明作者正在试图传达什么,那我会很感激。

回答

5

哇!我不知道,但如果你记得Coffeescript总是返回一个“块”的最后一个表达式,那么这是完全合理的。 所以你的情况,它返回(不通过“返回”语句如果这是混淆你)表达

num + " Brave Sir Robin ran away" 

从while条件相关的块,你会返回多个这样的表达也促使他们在一个数组上。

对生成的JavaScript看看,因为生成的代码是相当多的程序

var minstrel, num; 

num = 6; 

minstrel = (function() { 
    var _results; 
    _results = []; 
    while (num -= 1) { 
     _results.push(num + " Brave Sir Robin ran away"); 
    } 
    return _results; 
})(); 

我希望是有道理的,以你可能更清晰。

1

请注意,该函数调用可能非常低效!

下面是一个素因子发电机

'use strict' 

exports.generate = (number) -> 
    return [] if number < 2 
    primes = [] 
    candidate = 1 
    while number > 1 
    candidate++ 
    while number % candidate is 0 
     primes.push candidate 
     number /= candidate 
    candidate = number - 1 if Math.sqrt(number) < candidate 
    primes 

这是使用while作为表达

'use strict' 

exports.generate = (number) -> 
    return [] if number < 2 
    candidate = 1 
    while number > 1 
    candidate++ 
    primes = while number % candidate is 0 
     number /= candidate 
     candidate 
    candidate = number - 1 if Math.sqrt(number) < candidate 
    primes 

第一版跑到我的测试在4毫秒的版本,最后一个需要18毫秒。我相信原因是返回素数的生成闭包。