Passing the name of an argument and then its value

A

anne001

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
 
L

Logan Capaldo

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"
 
A

anne001

Sorry, I was not clear enough, the soap4r fx is generated by a ruby fx
wsdl2ruby.rb, it is a given.
the order of the arguments is derived from an Amazon wsdl file, it is
also given.

So given a fx with 30+ arguments, most of them empty, how can I access
it with
just the arguments which are not empty with the argument name.
 
A

anne001

I don't really want to write the names out! and I want it to be general
to apply to other methods in the wsdl amazon series.

but I like your idea, and it almost works, much cleaner way of passing
the parameters.
array_of_names.index(key) is nil in my case... I have to figure out
why. but I can use my own code for this if I don't find it. Anyway,
thank you so much for your time and ideas.

def namedrequest(fxname,hash)
nameinfo=eval(fxname).new.inspect

array_of_names=nameinfo.scan(/@(\w+)=/)
array_of_arguments=Array.new(array_of_names.length,'')
hash.keys.each{ |key|
array_of_arguments[array_of_names.index(key)]=hash[key]
}

command=fxname.slice(0,1).downcase+fxname.slice(1,fxname.length)+"="+fxname+".new(*array_of_arguments)"
p command
eval(command)
end
 
A

anne001

I don't really want to write the names out! and I want it to be general
to apply to other methods in the wsdl amazon series.

but I like your idea, and it almost works, much cleaner way of passing
the parameters.
array_of_names.index(key) is nil in my case... I have to figure out
why. but I can use my own code for this if I don't find it. Anyway,
thank you so much for your time and ideas.

def namedrequest(fxname,hash)
nameinfo=eval(fxname).new.inspect

array_of_names=nameinfo.scan(/@(\w+)=/)
array_of_arguments=Array.new(array_of_names.length,'')
hash.keys.each{ |key|
array_of_arguments[array_of_names.index(key)]=hash[key]
}

command=fxname.slice(0,1).downcase+fxname.slice(1,fxname.length)+"="+fxname+".new(*array_of_arguments)"
p command
eval(command)
end
 
A

anne001

oups, sorry about the repeat

array_of_names=array_of_names.flatten fixes some of the problems

but the real problem is the eval:
if array_of_arguments is
["dod", "dud"]
and command is
"itemSearchRequest=ItemSearchRequest.new(*array_of_arguments)"
the result is
#<ItemSearchRequest:0x2534c @artist=nil, @actor="dod">

I am not sure why
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,540
Members
45,025
Latest member
KetoRushACVFitness

Latest Threads

Top