在CoffeeScript中循环

时间:2013-02-20 06:12:35

标签: coffeescript

我是CoffeeScript的新手,并且一直在阅读这本书,The Little Book on CoffeeScript。以下是本书第2章中的几行,在阅读时让我很困惑:

  

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

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

虽然对于CoffeeScript程序员来说可能看起来不错,但作为一个新手,我无法理解代码的作用。此外,单词返回一个结果数组似乎与以下事实并不一致:while是一个循环结构,而不是一个函数。所以它的概念 返回 似乎令人困惑。此外,在循环的每次迭代中带有字符串num的变量"Brave Sir Robin ran away"似乎很笨拙,因为值num被用作循环计数器。

如果您能够解释代码的行为并且可能会用简单的示例说明作者试图传达的内容,我将感激不尽。

2 个答案:

答案 0 :(得分:5)

哇!我不知道,但如果你记得Coffeescript总是返回“块”的最后一个表达式,那就绝对有意义了。 所以在你的情况下,它返回(不是通过“return”语句,如果这让你感到困惑)表达式

 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 :(得分: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毫秒。我相信原因是生成的闭包返回了素数。