From: "Jesús Gabriel y Galán" Date: 2013-06-25T16:12:33+09:00 Subject: Re: Sum method through while loops or iteration On Tue, Jun 25, 2013 at 1:33 AM, Eric D. wrote: > I am trying to create a sum method for an empty array, that will return > "0" if there is nothing in it and the sum of the values if there are > values called through it. I have seen other ways on the internet, but I > am relatively new to this, and am under the impression that this can be > done with while loops or .each iteration. Below are various things I > tried, some were actual thoughts some were out of sheer frustration. > Thanks for your help! > 1. > def sum (array) > > array = [] > > while array >0 > array.each { |a| sum+=a } > > end You cannot compare an array to an integer. array > 0 doesn't make sense. You are probably getting this error when you run this: 2.0.0p195 :001 > a = [] => [] 2.0.0p195 :002 > a > 0 NoMethodError: undefined method `>' for []:Array from (irb):2 The next line is actually pretty near a solution. The only problem is that sum in that block is just a local variable to the block, so when you are outside of the block, you don't see it anymore. A way to fix it is to declare the variable outside initialized to 0: sum = 0 array.each {|a| sum += a} The other thing you need to know is that a Ruby method will return whatever the result of the last line is. In this case, your last line is calling the each method, which returns the original array. You have to return the sum, like so: 2.0.0p195 :003 > def sum 2.0.0p195 :004?> a = [1,2,3] 2.0.0p195 :005?> sum = 0 2.0.0p195 :006?> a.each {|x| sum += x} 2.0.0p195 :007?> sum 2.0.0p195 :008?> end => nil 2.0.0p195 :009 > sum => 6 > 2. > > def sum > x= [] > x.each{|element| element +element } > > end Here, the problem is that you are summing twice each element of the array (which is not what you want), but also, you are not doing anything with the result of that sum. What you do inside the block of "each" is not seen from the outside of the block, unless you assign it to a variable that can be seen outside. > 3. > def sum(array) > > while array.length > 0 > puts "#{array[x+y+z]}" > else > puts "0" In this case, array.length will either always be greater than 0 or not, since you are not modifying the array within the while loop. You could remove the elements to decrease the length, but this is not a very good solution for many reasons. Here are a couple more ways to do it: 1.- More procedural style: 2.0.0p195 :012 > sum = 0 => 0 2.0.0p195 :017 > a = [1,2,3,4] => [1, 2, 3, 4] 2.0.0p195 :018 > for i in 0...a.length 2.0.0p195 :019?> sum += a[i] 2.0.0p195 :020?> end => 0...4 2.0.0p195 :021 > sum => 10 2.- More functional styles: 2.0.0p195 :029 > a.inject(0) {|total, x| total + x} => 10 2.0.0p195 :030 > a.inject(:+) => 10 I think if you understand the first example above, using "each", you'll be good: sum = 0 array.each {|a| sum += a} puts sum Hope this helps, Jesus.