Coffeescript 咖啡脚本中的While循环

Coffeescript 咖啡脚本中的While循环,coffeescript,Coffeescript,我不熟悉咖啡脚本,一直在读这本书。以下是本书第二章中的几句话,在阅读时让我感到困惑: CoffeeScript公开的唯一低级循环是while循环。这与纯JavaScript中的while循环的行为类似,但还有一个额外的优点,即它返回一个结果数组,即类似于array.prototype.map()函数 虽然对于一个咖啡脚本程序员来说这看起来不错,但作为一个新手,我无法理解代码的作用。此外,返回结果数组的单词似乎与while是循环构造而不是函数这一事实不符。因此,它返回某物的概念似乎令人困惑。此外,

我不熟悉咖啡脚本,一直在读这本书。以下是本书第二章中的几句话,在阅读时让我感到困惑:

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

虽然对于一个咖啡脚本程序员来说这看起来不错,但作为一个新手,我无法理解代码的作用。此外,返回结果数组的单词似乎与while是循环构造而不是函数这一事实不符。因此,它返回某物的概念似乎令人困惑。此外,在循环的每次迭代中,带有字符串“Brave Sir Robin Run away”的变量
num
似乎很尴尬,因为值
num
被用作循环计数器


如果您能解释代码的行为,并用更简单的例子说明作者想要表达的内容,我将不胜感激。

哇!我不知道这一点,但如果你记得Coffeescript总是返回“block”的最后一个表达式,这绝对是有道理的。 因此,在您的情况下,它返回表达式(如果这使您感到困惑,则不是通过“return”语句)

 num + " Brave Sir Robin ran away" 
'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
从与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;
})();

我希望这对您有意义。

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

下面是一个主要因素生成器

'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
第一个版本在4毫秒内运行了我的测试,最后一个版本需要18毫秒。我相信原因是生成的闭包返回素数

'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