2

私は、CoffeeScript クラスを次のように拡張できることを知っています。

Dog::bark = ->
  console.log("bark")

これを動的に実行できるようにしたい。たとえば、次のようなことをしたい:

sounds = [ "bark", "woof", "grrr", "ruff" ] 

for sound in sounds
  Dog::[sound] = ->
    console.log(sound)

同等の JavaScript は次のようになります。

var sounds = [ "bark", "woof", "grrr", "ruff" ];

for (var i = 0; i < sounds.length; i++) 
{
  var sound = sounds[i];

  Dog.prototype[sound] = function() {
    console.log(sound);
  };
}

CoffeeScriptでこれを行うにはどうすればよいですか?

4

1 に答える 1

4

あなたはほとんどそれを持っています.新しいメソッドを構築するときdoに強制的に評価されるようにするには、そこにa を投げるだけです:sound

sounds = [ "bark", "woof", "grrr", "ruff" ] 
for sound in sounds
    do (sound) ->
        Dog::[sound] = -> console.log(sound)

を含めないdoと、4 つのメソッドすべてが を実行することになりますconsole.log('ruff')。を追加すると、ループの本体が自己実行関数にdo変換されます。細かいマニュアルforから(セクションの下部):

JavaScript ループを使用して関数を生成する場合、ループ変数が確実に閉じられるようにするためにクロージャー ラッパーを挿入するのが一般的であり、生成されたすべての関数が最終的な値を共有するだけではありません。CoffeeScript はdoキーワードを提供します。このキーワードは、渡された関数をすぐに呼び出し、引数を転送します。

デモ: http://jsfiddle.net/ambiguous/YAqJu/

于 2013-04-06T22:52:42.873 に答える