2016-10-31 5 views
0

文字列とオプションのハッシュを取るメソッドがあります。オプションのハッシュはメソッド名をキーとして、ブール値/値を値として持っています。この方法は、何をすべきsendメソッド:引数を渡すタイミングを選択します。

some_method("foo", upcase: true, times: 5) 

我々はFOOFOOFOOFOOFOOを得る5により、複数の、その後、それを文字列を取り、オプションのハッシュに基づいて、文字列の特定のメソッドを実行し、この場合には、それは文字列UPCASEを作るべきです出力として。ここで

私が午前問題は、私はsendメソッドを使用する場合、optionsハッシュからメソッドのいくつかは、引数(のような*を必要とし、いくつかは)(のような「UPCASE」ではないんです。

です私がこれまで持っているもの。

def method(string, options = {}) 
    options.each do |method_name, arg| 
    method_name = :* if method_name == :times 
    mod_string = mod_string.send(method_name, arg) 
    end 
end 

私は、引数の予想

間違った番号(0を予想、1を与えられた)としてエラーが発生します

(REPL):9:

「`UPCASEでだから、私の質問は次のとおりです。引数がある場合にのみ、引数を送信する方法はありますか?

私が思いついた唯一の事は、私はちょうど良い方法があるかどうかを確認したいブール値

options.each do |method_name, arg| 
    method_name = :* if method_name == :times 
    if arg == true 
     mod_string = mod_string.send(method_name) 
    elsif !(!!arg == arg) 
     mod_string = mod_string.send(method_name, arg) 
    end 
    end 

をチェックするif文を使用しています。

答えて

1

「方法は1つの必須の引数を持っている場合は、それを呼び出す」:

method = mod_string.method(method_name) 
arity = method.arity 
case arity 
when 1, -1 
    method.call(arg) 
when 0 
    method.call 
else 
    raise "Method requires #{arity} arguments" 
end 

Aおそらくより良い方法あなたは配列として渡したい引数をあなたのハッシュを再構築し、正確にそれを与えるために次のようになります。

some_method("foo", upcase: [], times: [5]) 

mod_string.send(method_name, *arg)です。

+0

私はちょうど 'arg = [arg] .reject {| el | el == true || el == false} '、および' mod_string.send(method_name、arg) 'を返します。それは美しく働いた。ありがとう – davidhu2000

関連する問題