3

私は 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

コードの動作を説明し、作者が伝えようとしていることをより簡単な例で説明していただければ幸いです。

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 に答える