2011-12-09 18 views
0

私は約20の引数を受け取るメソッドを持っています。その引数では、それらをすべて別のメソッドに渡したいと思います。それらをすべて再入力しなくても、すべてを2番目の方法に渡すことはできますか? args配列や、私が渡せるものはありますか?私が持っているものたくさんのargsを渡すRuby

:私が望む何

def my_method(arg1, arg2, ..., arg20) 
    #do some stuff 
    my_second_method(arg1, arg2, ..., arg20) 
    #do other stuff 
end 

def my_method(arg1, arg2, ..., arg20) 
    #do some stuff 
    my_second_method(args[array]) 
    #do other stuff 
end 
+9

私は、20の引数を持たないことを強くお勧めします。 –

+2

他に誰かが何か匂いがする?腐った卵のように... – Mike

答えて

8

is a code smell。この方法は、あまりにも多くの種類のデータであまりにも多くのことを行うことをほぼ確実に試みています。

Rubyのスプラット演算子を使用してこのやり方をやってみてください。

def one(*args) 
    # process/validate args 
    two(*args)  # Note that the splat is needed here too. 
    end 

    def two(*args) 
    # do work 
    end 
5

あなたはRubyのスプラット演算子使用することができます。その多くの引数を受け取るメソッドを持つ

def my_method(*args) 
    # do some stuff 
    my_second_method(*args) 
    # do other stuff 
end 

def my_second_method(*args) 
    # use args[0] through args[19] 
end 
+1

'my_second_method(args)'は 'my_second_method(* args)'に変更するべきだと思います(Rubyにパターンマッチングがあった場合、それは可能です:my_second_method(args) ') ) – maprihoda

+0

修正済み、ごめんなさい。 –

0
def as_array(*args) 
    if args.length == 3 
    a, b, c = args 
    puts "a=#{a} b=#{b} c=#{c}" 
    end 
end 


as_array 1, 2, 3 
3

ので、これは最高のアイデアではないかもしれませんが、あなたは引数を管理するためにハッシュを使用することができ、と述べました。

Railsはこのロット行います

render :partial => "new", :locals => {:object => @my_object} 

Rubyのactivesupportのは、これに対処するための方法、extract_options!機能は、それがsimone carletti 's blog

+1

+1 20個の引数(本当に必要な場合)では、オプションのハッシュはそれを読みやすくするための素晴らしい方法です。 –

+0

またはパラメータオブジェクト... –

+0

...またはRuby 2.0を使用している場合のキーワードパラメータ。 –

0

の詳細であるあなたが頻繁に見ることができる一般的なイディオムがありますがありますRubyコード:スプラットオペレータがどのように使われるか

def method1(*args) 
    method2(*args) 
end 

def method2(*args) 
end 

method1(a, b, c, d, e, f, g) 

注意してください。基本的には、まずargsを配列にパックし、メソッド呼び出し時に引数を個々の引数に展開します。 argsを別のメソッド、例えばイニシャライザに渡すだけでよい場合は非常に便利です。

関連する問題