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


114

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

Splatsの目的がよくわかりません。この構造は何ですか?それは(歴史的に)どこから来たのですか?


そしていつものように、あなたはまた、バニラのJSで実装することができる方法を知っている必要があります:arguments+ callstackoverflow.com/questions/17380315/...
チロSantilli郝海东冠状病六四事件法轮功

1
私はそれを不定の連続体に「スプラッティング」(ペイントのような)するパラメータと考えたい
arviman

3
Pythonに傾倒している人のために:これはあなたの*argsin def foo(*args):です。
マリグリー2015年

1
用語の注記:ES6は同様の接頭辞構文を採用しました。ES6では、受信, ...argsレストパラメータ...args呼ばれ、関数呼び出し/配列/オブジェクトリテラルに展開すると、スプレッド
Beni Cherniavsky-Paskin

回答:


199

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

CoffeeScriptは非常に早い段階でRubyスタイルのスプラットを採用しましたが(問題16を参照)、Douglas Crockfordの提案により、構文は2週間後に変更され*xましx...た(問題45を参照)。それでも、CoffeeScripterは構文を「splat」または「splatオペレーター」と呼んでいます。

彼らが実際に行うargumentsことに関して、スプラットは、スプラットされた引数がすべての「余分な」引数の配列になるような方法でオブジェクトをスライスします。最も平凡な例は

(args...) ->

この場合、argsは単にの配列コピーになりargumentsます。スプラット引数は、標準引数の前、後、または間に置くことができます。

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

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

JavaScriptは同じ名前の関数に複数のシグネチャを許可しないため(CとJavaのように)、スプラットはさまざまな数の引数を処理するための非常に時間の節約になります。


2
C#paramsキーワードに似ています。
ThatMatthew 2012

これをいつ使用する必要がありますか?
ジェフスコットワード

1
受け入れるパラメータの数が不明な場合。
gprasant 2013

1
技術的には[バリアード関数](en.wikipedia.org/wiki/Variadic_function)、または不明確な「アリティ」の関数として知られています。ほとんどの言語では、変数の引数を示すために、ある種の楕円形を使用しています。
Lawrence Dol

1
@JeffScottWardの完璧な例はconsole.logで、任意の数の引数を受け入れます。console.log('this:',variable,'should be replaced with', another_variable);
Rob

13

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]

6

スプラットとは、...var-args(可変数の引数を取る関数)の演算子の使用を表す用語です。


参照:Pythonの* argsと** kwargs、およびActionScript 3のRESTパラメーター。
ジョーダン

3

私はそれがjavascriptの引数オブ​​ジェクトの構文砂糖だと思います。

このアイデアは、rubyのsplatオペレーターから*生まれるかもしれません。


中:それは割り当ての左側両面、および名前付き引数と組み合わせることができます使用できるよう技術的に、それは、もう少しだ(x, rest...) ->rest含まれて文句を言わないxargumentsありません。
ケプラ2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.