1

forCoffeeScript でループの出力を参照する正しい方法はありますか。内部変数を使用すると_resultsうまくいく場合もあるようですが、いくつかの状況ではうまくいきます (以下を参照)。安定したアキュムレータを参照する「正しい」方法はありますか?

作品

Array::unique = ->
  value for value in this when not (value in _results)

機能しません (イテレータの名前を に変更します_results2)

Array::unique = ->
  _results = null
  value for value in this when not (value in _results)

また、機能しません(イテレータの名前を に変更します_results2

Array::unique = ->
  value for value in (value for value in this) when not (value in _results)
4

2 に答える 2

3

アキュムレータは実装の詳細です。あなたはそれと対話することを意図していません。そのため、既にその名前を使用している場合は、変数の名前が変更されます。reduce() 関数が必要なようです (Firefox にはこの関数が組み込まれており、一般的なライブラリのほとんどがそれをサポートしています)。

于 2011-08-29T04:51:34.360 に答える
0

_resultsCoffeeScript から直接のように、生成された変数を操作できるとは思えません。ただし、エスケープされた JavaScript (コンパイラは単純に無視します) を使用してこれを行うことができます。

Array::unique = ->
  value for value in this when not (`value in _results`)

にコンパイルします

Array.prototype.unique = function() {
  var value, _i, _len, _results;
  _results = [];
  for (_i = 0, _len = this.length; _i < _len; _i++) {
    value = this[_i];
    if (!value in _results) {
      _results.push(value);
    }
  }
  return _results;
};

ただし、スタイル的には、純粋な CoffeeScript でリスト内包表記をコーディングする方が望ましいと思います。それはたった3行です:

Array::unique = ->
  results = []
  results.push value for value in this when value not in results
  results

関数の実装に関してはunique(これは少し余談ですが)、大きな配列を繰り返し処理する必要があるため、大きな場合はうまくスケーリングできないことに注意する必要がありNます(特別な場合を除くランタイムのindexOf効率は O(N) よりも優れています)。Nただし、ハッシュを使用して大きなサイズを比較的効率的に処理することは可能です。私が提案した Underscore.js の _.uniq の実装を参照してください

于 2011-08-29T18:15:03.600 に答える