2009-08-26 14 views
3

Ruby関数に渡されるデフォルトの引数を変更したいと思います。たとえば、代わりに各時間の私は、デフォルトのパラメータを変更する最も簡単な、クリーン、ほとんどのRubyのような方法で何デフォルトのRuby引数を変更する

[1,2,3].do_stuff 

を書くことができるようにデフォルトを変更したい

[1,2,3].do_stuff(:option => ' my option ') 

を書きます?

答えて

2
>> [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!依存。 (現在、[] =メソッドを使用するより良い代替方法を探しています)

0

あなた自身で書かなかったコードの解決策が必要ですか?私が知っている2つのオプションがあります。

コードを自分で書いた:

def some_method_you_wrote(options) 

は次のようになります。

def some_method_you_wrote(options = { :option1 => 'value' }) 

あなたは、書き込みエイリアシング方法に見ていないコードの場合

(Swanandの答えは、あまりにもいいです)。 (Railsは、この目的のためにIIRCと呼ばれるものalias_method_chainを提供します。)

+0

このアプローチの問題点は、 'option1'キーが設定されていないオプションのハッシュを渡すと 'option1'オプションが設定されないということです。 – Benjamin

1

(あなたの元の質問から移動)

私はあなたがすでに存在する方法アレイ#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の将来の使用には問題ありません。

関連する問題