From: Robert Dober Date: 2006-11-12T18:01:54+09:00 Subject: Re: eval question ------=_Part_92935_18525225.1163322112347 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline On 11/11/06, Peter Szinek wrote: > > Hi, > > I am setting up a few variables based on user input with the following > code snippet: > > ================================== > vars = %w{a b c} > > vars.each do |var| > print "#{var} = " > val = gets > eval("$#{var}=#{val.chomp}") > end > > #use a, b, c here for something > ================================== > > What I don't like about this code is the use of global variables. > However, I have to use them - or otherwise a,b,c will be already out of > scope at the place I need them. > > Another possibility would be to use constants, i.e. > > vars = %w{A B C} > > which would work well - however, since I am repeating the process more > times, from the second iteration on I am getting warnings that A, B, C > etc were already initialized, which is not nice. > > I guess yet another possibility would be to wrap a class around this > stuff and use instance_eval or something like that - but a class that > serves solely this purpose looks to heavy to me... > > Any other ideas? > > TIA, > Peter Just two tiny improvements * Do not use globals * Do not use eval #!/usr/bin/ruby vars = %w{a b c} vars.each do |var| print "#{var} = " val = gets.chomp instance_variable_set "@#{var}", val end puts "a = #{@a}" Maybe you prefer this? But if you want to access the instance variables by name you can also define an attribute_reader/writer/accessor inside the vars.each loop. Cheers Robert __ > http://www.rubyrailways.com > > -- The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. - George Bernard Shaw ------=_Part_92935_18525225.1163322112347--