3

我是 CoffeeScript 新手,并且一直在阅读《关于 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 被用作循环计数器。

如果您能解释代码的行为,或许可以用更简单的示例说明作者试图传达的内容,我将不胜感激。

4

2 回答 2

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;
})();

我希望这对你有意义。

于 2013-02-20T06:42:46.137 回答
0

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

下面是一个素数生成器

'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

这是使用whileas 表达式的版本

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

于 2014-12-13T22:12:56.250 回答