Ruby関数に渡されるデフォルトの引数を変更したいと思います。たとえば、代わりに各時間の私は、デフォルトのパラメータを変更する最も簡単な、クリーン、ほとんどのRubyのような方法で何デフォルトのRuby引数を変更する
[1,2,3].do_stuff
を書くことができるようにデフォルトを変更したい
[1,2,3].do_stuff(:option => ' my option ')
を書きます?
Ruby関数に渡されるデフォルトの引数を変更したいと思います。たとえば、代わりに各時間の私は、デフォルトのパラメータを変更する最も簡単な、クリーン、ほとんどのRubyのような方法で何デフォルトのRuby引数を変更する
[1,2,3].do_stuff
を書くことができるようにデフォルトを変更したい
[1,2,3].do_stuff(:option => ' my option ')
を書きます?
>> [1, 2, 3].do_stuff
=> Result I get
>> [1, 2, 3].do_stuff :an_option => a_value
=> Result I really want, but don't want to specify the argument
私はこのためにsuper
を使用します。それは私たちだけの変更デフォルト引数とは別に方法にいくつかの機能を追加することができます:
class Array
def do_stuff(options = {})
# Verify if caller has not passed the option
options[:argument_i_want_to_change] = default_value_i_want unless options.has_key? :argument_i_want_to_change
# call super
super
end
end
結果:
>> [1, 2, 3].do_stuff
=> Result that I really want
UPDATE:削除しましreverse_merge!依存。 (現在、[] =メソッドを使用するより良い代替方法を探しています)
あなた自身で書かなかったコードの解決策が必要ですか?私が知っている2つのオプションがあります。
コードを自分で書いた:
def some_method_you_wrote(options)
は次のようになります。
def some_method_you_wrote(options = { :option1 => 'value' })
あなたは、書き込みエイリアシング方法に見ていないコードの場合
(Swanandの答えは、あまりにもいいです)。 (Railsは、この目的のためにIIRCと呼ばれるものalias_method_chain
を提供します。)
(あなたの元の質問から移動)
私はあなたがすでに存在する方法アレイ#1 do_stuffについて話していると仮定していますが、少しそれを変更したいです(あなたの場合は、デフォルトのパラメータを変更します)。
ポストhereはそれを行う良い方法を提供します。エイリアス技術と同じ問題はありません。残りの「古い」メソッドがないからです。あなたはあなたの例の問題とその技術を使用することができますどのようにここで
あなたはまた、上記のコードは混乱している場合UnboundMethod上に読みたいかもしれません
class Array
old_do_stuff = instance_method(:do_stuff)
define_method(:do_stuff) { |options = {}|
options[:option] ||= " option "
old_do_stuff.bind(self).call(options)
}
end
(ルビー1.9でテスト済み)。 old_do_stuffはendステートメントの後にスコープから外れるので、Arrayの将来の使用には問題ありません。
このアプローチの問題点は、 'option1'キーが設定されていないオプションのハッシュを渡すと 'option1'オプションが設定されないということです。 – Benjamin