2

私は次のCoffeescriptコードを持っています:

result = ([number, process = number * 2, process] for number in [1, 2, 3])

これは次のようにコンパイルされます。

var number, process, result;

result = (function() {
  var _i, _len, _ref, _results;
  _ref = [1, 2, 3];
  _results = [];
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    number = _ref[_i];
    _results.push([number, process = number * 2, process]);
  }
  return _results;
})();

結果は多次元配列です。

[ [1, 2, 2], [2, 4, 4], [3, 6, 6] ]

これprocessは非常にコストがかかる計算であり、その値をいくつかの異なる関数の引数として使用したいとします。

result = ([number, process = /* costly calculation */, function1(process), function2(process), function3(process)] for number in [1, 2, 3])

これは実際には問題なく機能します。processただし、それ自体の値が結果の配列の要素になることは望ましくありません。その値は、配列の2番目の要素のままです。コンパイルされたJavascriptを見ると、process次のように配列の定義を簡単に移動できます。

for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    number = _ref[_i];
    process = number * 2;
    _results.push([number, process]);
}

Coffeescriptでそれを行うにはどうすればよいですか?

オンラインでお試しください!

4

2 に答える 2

1

これを行うと、これで問題が解決するはずです。

result = ([number = (process = /* costly calculation */) - process + number, function1(process), function2(process), function3(process)] for number in [1, 2, 3])

ここでは、配列内のすべての数値に対して2つの追加操作(加算と減算)が実行されます。しかし、それは計算コストにあまり追加するべきではありません。

さらに最適化して、計算コストを下げることができます。

アップデート:

変数が必要ない場合はこれを使用してくださいnumberprocess

result = ([function1(process = /* costly calculation */), function2(process), function3(process)] for number in [1, 2, 3])
于 2013-03-05T10:19:22.683 に答える
1

CoffeeScriptでは、ブロックも式であるため、次のことができます。

result = (process = costlyCalculation(); [number, function1(process), function2(process), function3(process)] for number in [1, 2, 3])

または、ステートメントを区切るためにセミコロンを使用する代わりに、改行を使用することをお勧めします。

result = for number in [1, 2, 3]
  process = costlyCalculation()
  [number, function1(process), function2(process), function3(process)]
于 2013-03-05T13:45:16.087 に答える