From: Austin Ziegler Date: 2004-08-17T02:13:17+09:00 Subject: Re: A method for summing several variables On Tue, 17 Aug 2004 01:48:09 +0900, Harry Truax wrote: > Hi everyone, > > Just wanted to say thank you for all of your suggestions and coding examples. I will be studying your ideas closely to see if I can implement them in our product. I really > do not have the leeway to alter our product's code structure, I have to live with this fact (argh!!). > > Our field variables (the ones we do arithematic on) are set up like: > > box1_1 = '' > box1_2 = '' > box1_3 = '' > box1_4 = '' > box1_5 = '' > box1_6 = '' > box1_7 = '' > box1_8 = '' > box1_9 = '' > box1_10 = '' > box1_11 = '' > etc. > > The actual amount and thus naming of these variables vary from application to application. Some of the summing operations are quite lengthy as in: > > box5_189 = $CUR % (box5_5.to_f + box5_10.to_f + box5_15.to_f + box5_20.to_f + box5_25.to_f + box5_30.to_f + box5_35.to_f + box5_40.to_f + box5_45.to_f + box5_50.to_f + box5_55.to_f + box5_60.to_f + box5_65.to_f + box5_70.to_f + box5_75.to_f + box5_80.to_f + box5_85.to_f + box5_90.to_f + box5_95.to_f + box5_100.to_f + box5_105.to_f + box5_110.to_f + box5_115.to_f + box5_120.to_f + box5_125.to_f + box5_130.to_f + box5_135.to_f + box5_140.to_f + box5_145.to_f + box5_150.to_f + box5_155.to_f + box5_160.to_f + box5_165.to_f + box5_170.to_f + box5_175.to_f + box5_180.to_f + box5_185.to_f + box5_187.to_f) > > I will try to find a shortcut method to handle this based on your suggestions, but if I have to manually type in each box name in setting up the implementation, I may > as well just type in the lengthy sum operation as shown above. I didn't participate in the initial round, but why not do a generator and then eval your generated string in the current binding? s = (5..185).to_a.select { |e| e % 5 == 0 }.map { |e| "box5_#{e}.to_f" } s << "box5_187.to_f" box5_189 = $CUR % [eval("(#{s.join(' + ')})", binding)] This will work so long as there's some kind of pattern you can deal with (I don't get the box5_187 in your example, but I added it as an exception). I tested in irb with: v = (5..187).to_a v = v.select { |e| (e % 5 == 0) or (e == 187) }.map { |e| "box5_#{e}" } v << "box5_187" b = binding v.each_with_index { |e, i| eval("#{e} = 1.25", b) } puts box5_10 # => 1.25 $CUR = "%020.10f" # the above set the test data; the below is the implementation s = (5..187).to_a.select { |e| (e % 5 == 0) or (e == 187) } s.map! { |e| "box5_#{e}.to_f" } box5_189 = $CUR % [eval("(#{s.join(' + ')})", binding) puts box5_189 # => 000000047.5000000000 puts v.size * 1.25 # => 47.5 -austin -- Austin Ziegler * halostatue@gmail.com * Alternate: austin@halostatue.ca