【问题标题】:While loop in CoffeeScriptCoffeeScript 中的 While 循环
【发布时间】:2014-12-14 06:12:56
【问题描述】:

我是 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 程序员来说可能看起来不错,但作为新手,我无法理解代码的作用。此外,returns a array of results 似乎与 while 是循环结构而不是函数这一事实不符。因此,它返回的概念似乎令人困惑。此外,在循环的每次迭代中,带有字符串"Brave Sir Robin ran away" 的变量num 似乎很尴尬,因为值num 被用作循环计数器。

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

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    哇!我不知道,但如果你记得 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;
    })();
    

    我希望这对你有意义。

    【讨论】:

      【解决方案2】:

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

      下面是一个素因数生成器

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

      【讨论】:

        猜你喜欢
        • 2011-08-28
        • 1970-01-01
        • 2014-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-24
        • 2016-11-27
        • 1970-01-01
        相关资源
        最近更新 更多