On Jul 19, 2006, at 5:50 PM, anne001 wrote: > I have a soap4r created fx to search amazon which has too many > arguments to use comfortably > itemSearchRequest = ItemSearchRequest.new("", "", "", "", "", "", "", > "", "", "", "", "", > "","","","","","","gabin","","","","","","","","","","","","Books","", > "","","","")? > > I would like to only type the name of the key search and the value. I > came up with some code which almost works. Can I do simpler, easier to > read than this? or more principled, more elegant? > ------------------> > #Here is a simplified version of the fx, with just 2 elements > class ItemSearchRequest > attr_accessor :actor > attr_accessor :artist > def initialize(actor = nil, artist = nil) > @actor = actor > @artist = artist > end > end > itemSearchRequest = ItemSearchRequest.new > p itemSearchRequest.inspect > itemSearchRequest = ItemSearchRequest.new("", "dud") > p itemSearchRequest.inspect > itemSearchRequest = ItemSearchRequest.new(artist="dod") > p itemSearchRequest.inspect > > --------> > # this is the method I wrote to simplify the accessing of the fx > def namedrequest(fxname,hash) > nameinfo=eval(fxname).new.inspect > p nameinfo > # should return something like the following > # nameinfo="#<ItemSearchRequest:0x25cd4 @artist=nil, @actor=nil>" > > > command=fxname.slice(0,1).downcase+fxname.slice(1,fxname.length) > +"="+fxname+".new(" > namearray=nameinfo.scan(/@(\w+)=/) > namearray.each{ |key| > p key > p key[0] > command = command +'"'+ (hash[key[0]] || "")+'",' > } > #replace last coma with ) > command = command.sub(/,$/,")") > p command > eval(command) > end > > namedrequest("ItemSearchRequest",{"artist" =>"dod", "actor" =>"dud"}) > p itemSearchRequest > > I would use a hash, a splat and an array. My solution follows, it avoids the use of eval. % cat lots_of_params.rb def wrapper(hash) parameter_names_in_order_passed_to_func = %w[param_first param_second param_third] array_of_arguments = Array.new (parameter_names_in_order_passed_to_func.length, '') hash.keys.each do |key| array_of_arguments[parameter_names_in_order_passed_to_func.index (key)] = hash[key] end real_func(*array_of_arguments) end def real_func(param_first, param_second, param_third) puts "param_first=#{param_first.inspect}" puts "param_second=#{param_second.inspect}" puts "param_third=#{param_third.inspect}" end wrapper('param_second' => 'hello') puts wrapper('param_third' => 'ok') puts wrapper('param_first' => 'hello', 'param_third' => 'blah') % ruby lots_of_params.rb param_first="" param_second="hello" param_third="" param_first="" param_second="" param_third="ok" param_first="hello" param_second="" param_third="blah"