1

この不自然な例に似た CoffeeScript 関数を作成しました。

my_func = (a, b, use_args = false) ->
  if use_args?
    other_func 'foo', a, b, 'bar'
  else
    other_func 'foo', 'bar'

これは、次の JavaScript にコンパイルされます。

var my_func;
my_func = function(a, b, use_args) {
  if (use_args == null) {
    use_args = false;
  }
  if (use_args != null) {
    return other_func('foo', a, b, 'bar');
  } else {
    return other_func('foo', 'bar');
  }
};

への重複呼び出しを排除するこの関数への DRY アプローチはありother_funcますか? 何かのようなもの:

my_func = (a, b, use_args = false) ->
  other_func 'foo', a if use_args?, b if use_args?, 'bar'

しかし、それは実際に構文的に正しいですか?うまくいけば、ここで明らかな何かが欠けていません。CoffeeScript がこれを行うための便利な方法を提供しているかどうか、または使用すべきより優れた JavaScript パターンがあるかどうかはわかりません。

ちなみに、other_func別のパラメーターを使用するように変更することはできません。実際に_gaq.push()は、追跡情報をキューに追加する Google アナリティクス ライブラリの一部であるためです。

4

3 に答える 3

2

まず、元の質問のコードは問題ないと思います(引数リストのコード以外は、= false私のコメントを参照してください)。それは完全に効率的で読みやすいです。しかし、繰り返しが本当に気になる場合は、読み進めてください。

クリスは彼の答えで正しい軌道に乗っています。これは CoffeeScript なので、利用できるシンタックス シュガーがいくつかあります。

  • の代わりにarr.splice(1, 0, [a, b])、 と書くことができますarr[1...1] = [a, b]

  • の代わりにfunc.apply(null, arr)、単に書くことができますfunc arr...

したがって、これらを組み合わせると、関数を 3 つの短い繰り返しのない行にまとめることができます。

my_func = (a, b, use_args) ->
  args = [foo, bar]
  args[1...1] = [a, b] if use_args
  other_func args...

チェックを行う必要がないことに注意してuse_args?ください。nullまたはの場合、自動的に (JavaScript によって) forundefinedに強制されます。falseif use_args

于 2011-09-12T15:02:31.823 に答える
1

次の組み合わせを使用します。

  • Array.splice()追加のパラメーターをパラメーターの配列に挿入し、
  • apply()パラメータの配列を指定して関数を呼び出します。

ここにデモがあります:

http://jsfiddle.net/ZSVtB/

于 2011-09-12T13:36:42.820 に答える
-1
var my_func = function(a, b, use_args) { 
  var args = []
  args.push('foo')
  use_args && args.push(a, b)
  args.push('bar')
  return other_func.apply(null, args)
}

いやいや、withこれからは。

于 2011-09-12T13:25:00.277 に答える