On Tue, Jun 25, 2013 at 1:33 AM, Eric D. <lists / ruby-forum.com> 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.