Logan Capaldo
7/19/2006 10:21:00 PM
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"