web-dev-qa-db-ja.com

CoffeeScriptチュートリアルで「スプラット」とはどういう意味ですか?

このCoffeeScriptチュートリアルを見る: http://jashkenas.github.com/coffee-script/

私はスプラットが何のためにあるのかよくわかりません。この構造は何ですか?どこから来たのか(歴史的に)

112
interstar

「スプラット演算子」という用語は、Rubyに由来し、*文字( "splat"と呼ばれることもあります。 Jargon Fileエントリ を参照)は、引数リストのエントリが引数リストを「吸収」することを示すために使用されます。

CoffeeScriptは非常に早い段階でRubyスタイルのスプラットを採用しました( issue 16 を参照)が、ダグラスクロックフォードの提案で、構文は*xからx...数週間後( issue 45 を参照)。それでも、CoffeeScripterは、構文を「スプラット」または「スプラット演算子」と呼んでいます。

実際に何をするかについては、スプラットは、スプラッティングされた引数がすべての「余分な」引数の配列になるようにargumentsオブジェクトをスライスします。最も些細な例は

(args...) ->

この場合、argsは単にargumentsの配列コピーになります。スプラッティングされた引数は、標準引数の前、後、または間に配置できます。

(first, rest...) ->
(rest..., last) ->
(first, rest..., last) ->

最初の2つの場合、関数が0-1個の引数を受け取ると、restは空の配列になります。最後のケースでは、関数はrestが空でないために3つ以上の引数を受け取る必要があります。

JavaScriptは同じ名前の関数に複数の署名を許可しないため(CおよびJava doの方法)、スプラットはさまざまな数の引数を処理するための大きな時間の節約になります。

197
Trevor Burnham

pythonを知っている場合は、args...おおよそ*args、関数パラメーターをリストとして扱うことができるため

例えば:

concat = (args...) -> args.join(', ')
concat('hello', 'world') == 'hello, world'
concat('ready', 'set', 'go!') == 'ready, set, go!'

アサインメントでも機能します:

[first, rest...] = [1, 2, 3, 4]
first == 1
rest == [2, 3, 4]
13
keppla

スプラットは、var-args(可変個の引数を取る関数)に...演算子を使用することを意味します。

6
Jeff Foster

Javascriptのargumentsオブジェクトの構文糖衣だと思います。

アイデアは、Rubyの splat演算子*

3
Zifei Tong