私は、渡される引数の数が分からないときにsplat引数が使用されることを知っています。私はいつもスプラットを使うべきかどうかを知りたかったのです。引数を渡すたびにsplat引数を使用する際にリスクはありますか?あなたが書いているメソッドは、メソッドのようなHash#values_at
のために、任意の数の引数を持っている本物の必要性を持っている場合Rubyのsplat引数が常に使われていないのはなぜですか?
答えて
スプラットは素晴らしいです。この方法は、実際の引数の固定数を必要とする場合の周りの配列を渡すと、その目的機能する位置を覚えておく持つことよりもかかわらず、一般的には
は、それは名前付き引数を持っている多くの明確です。たとえば:
def File.rename(old_name, new_name)
...
end
はより明確である:
def File.rename(*names)
...
end
あなたは古い名前は、第1または第2のだったかどうかを知るためにドキュメントを読む必要があるだろう。メソッドの内部では、File.rename
は、正しい数の引数を渡したかどうかを中心にエラー処理を実装する必要があります。だから、あなたがスプラットを必要としない限り、 "通常の"引数は通常より明確です。標準ライブラリの使用はまだ普及していないものの(ルビー2.0の新機能)
キーワードの引数は、使用の時点でさえ明確にすることができます。
スプラットは、引数が配列として解釈することができます、そしてあなたはそれを取るために余分なステップが必要になります。
def foo x
@x = x
end
いますが、スプラットを使って配列に入れた場合、あなたは、配列の外にそれを取るために余分なステップが必要です:スプラットがなければ、引数にアクセスするために行うには、特別なものを必要としない
def foo *x
@x = x.first # or x.pop, x.shift, etc.
end
必要でない限り、余分なステップを導入する理由はありません。パラメータの任意の量を取る方法については
、オプションのハッシュが事実上のソリューションです:
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
あなたは、配列を扱うだけ使用したいしているときスプラットの良い使用であります配列の最初の引数をとり、配列の残りの部分と何かを実行します。それは他の方法よりもはるかに迅速です。ここでは、スマートな男Jesse Farmerの使い方https://gist.github.com/jfarmer/d0f37717f6e7f6cebf72があります。ここでは、スパイラルアレイの問題を解決するためのいくつかの方法と、それに付随するベンチマークの例を示します。 https://gist.github.com/TalkativeTree/6724065
それに伴う問題は、それが簡単に消化ではないということです。これまでに見たことがあるのであれば、素晴らしいことですが、コードが何をしているのかについての他の人の理解が遅くなる可能性があります。あなたがしばらくそれを見ていないならば、あなた自身でさえ。
- 1. plot.defaultの "mar"引数が使われないのはなぜですか?
- 2. パラメータでsplatを使用しているときに関数が機能しないのはなぜですか?
- 3. initが最初の引数(Wordpress)としてadd_action関数で使われているのはなぜですか?
- 4. このコード例でdouble splat(**)引数は何を意味し、なぜそれを使用するのですか?
- 5. Ruby、Splatのソースコード?
- 6. なぜシステムコールセクションで `execlp()`が使われないのですか
- 7. Array#keep_ifでRubyの規約に従わないのはなぜですか?
- 8. コンパイルされているにもかかわらず、TSエラーが非常に多いのはなぜですか?
- 9. なぜ画面全体が使われていないのですか?
- 10. なぜクランはもっと使われないのですか?
- 11. EXC_BAD_ACCESSとゾンビですが、なぜそれが引き続き起こっているのかわからない
- 12. なぜパラメータは常にsetInterval()の関数に送られないのですか?
- 13. なぜ `OnWorkerEvent`が` wxProgressDialog`で使われていますか?
- 14. なぜlog4netがnhibernateで使われていますか?
- 15. なぜサブセットはデータフレームのサブセット引数が欠けても構わないのですか?
- 16. なぜcross_validation.train_test_splitの引数random_stateがブール値ではない整数
- 17. Sparkのcache()関数の引数がないのはなぜですか?
- 18. 引数として別のメソッドを渡すメソッドでは、渡された引数にその引数を渡す必要がないのはなぜですか?
- 19. JavaScriptの引数の前にvarキーワードがないのはなぜですか?
- 20. なぜ変数が列のように扱われているのですか?
- 21. これらの変数のすべてが同じように扱われないのはなぜですか?
- 22. Ruby 1.9で非明示的なsplat paramとdefault paramがメソッド定義の構文が間違っているのはなぜですか?
- 23. notepad ++オートコンプリートが関数引数で機能しないのはなぜですか?
- 24. 引数を指定したreturn関数が定義されていないのはなぜですか?
- 25. セッション変数が失われているのはなぜですか?
- 26. なぜRubyではシンボルがnilに変換されないのですか?
- 27. コールバックが引数として含まれていると、fs.readFileにラッパーが必要なのはなぜですか?
- 28. yield式を関数の引数にできないのはなぜですか?
- 29. ユニットテスト:平等テストで期待される引数が常に最初になるのはなぜですか?
- 30. 関数に文字列引数を渡す - それはなぜ機能していないのですか?
+1「...本物の必要性を持っています...」は、ここで重要な語句です。私の意見では、人工的に '*'を常に使っているのはメンテナンス上の問題を引き起こし、結果としてRubyのコードが少なくて済むからです。 –
名前付きパラメータの方がずっと前よりもはるかに意味があります。ハッシュを渡し、 '**'オペランドを介して名前付きパラメータに変換するときに使用されます。 –