2013-05-19 3 views
5

私は、渡される引数の数が分からないときにsplat引数が使用されることを知っています。私はいつもスプラットを使うべきかどうかを知りたかったのです。引数を渡すたびにsplat引数を使用する際にリスクはありますか?あなたが書いているメソッドは、メソッドのようなHash#values_atのために、任意の数の引数を持っている本物の必要性を持っている場合Rubyのsplat引数が常に使われていないのはなぜですか?

答えて

17

スプラットは素晴らしいです。この方法は、実際の引数の固定数を必要とする場合の周りの配列を渡すと、その目的機能する位置を覚えておく持つことよりもかかわらず、一般的には

は、それは名前付き引数を持っている多くの明確です。たとえば:

def File.rename(old_name, new_name) 
    ... 
end 

はより明確である:

def File.rename(*names) 
    ... 
end 

あなたは古い名前は、第1または第2のだったかどうかを知るためにドキュメントを読む必要があるだろう。メソッドの内部では、File.renameは、正しい数の引数を渡したかどうかを中心にエラー処理を実装する必要があります。だから、あなたがスプラットを必要としない限り、 "通常の"引数は通常より明確です。標準ライブラリの使用はまだ普及していないものの(ルビー2.0の新機能)

キーワードの引数は、使用の時点でさえ明確にすることができます。

+2

+1「...本物の必要性を持っています...」は、ここで重要な語句です。私の意見では、人工的に '*'を常に使っているのはメンテナンス上の問題を引き起こし、結果としてRubyのコードが少なくて済むからです。 –

+1

名前付きパラメータの方がずっと前よりもはるかに意味があります。ハッシュを渡し、 '**'オペランドを介して名前付きパラメータに変換するときに使用されます。 –

1

スプラットは、引数が配列として解釈することができます、そしてあなたはそれを取るために余分なステップが必要になります。

def foo x 
    @x = x 
end 

いますが、スプラットを使って配列に入れた場合、あなたは、配列の外にそれを取るために余分なステップが必要です:スプラットがなければ、引数にアクセスするために行うには、特別なものを必要としない

def foo *x 
    @x = x.first # or x.pop, x.shift, etc. 
end 

必要でない限り、余分なステップを導入する理由はありません。パラメータの任意の量を取る方法については

3

、オプションのハッシュが事実上のソリューションです:

def foo(options = {}) 
    # One way to do default values 
    defaults = { bar: 'baz' } 
    options = defaults.merge(options) 

    # Another way 
    options[:bar] ||= 'baz' 

    bar = options[bar] 
    do_stuff_with(bar) 
end 
2

あなたは、配列を扱うだけ使用したいしているときスプラットの良い使用であります配列の最初の引数をとり、配列の残りの部分と何かを実行します。それは他の方法よりもはるかに迅速です。ここでは、スマートな男Jesse Farmerの使い方https://gist.github.com/jfarmer/d0f37717f6e7f6cebf72があります。ここでは、スパイラルアレイの問題を解決するためのいくつかの方法と、それに付随するベンチマークの例を示します。 https://gist.github.com/TalkativeTree/6724065

それに伴う問題は、それが簡単に消化ではないということです。これまでに見たことがあるのであれば、素晴らしいことですが、コードが何をしているのかについての他の人の理解が遅くなる可能性があります。あなたがしばらくそれを見ていないならば、あなた自身でさえ。

関連する問題