[#407882] Ruby extremely slow compared to PHP — Mick Jagger <lists@...>

Hello there, how are you? Hope you are fine. I am a PHP programmer

17 messages 2013/06/02

[#407908] TCPServer/Socket and Marshal problem — Panagiotis Atmatzidis <atma@...>

Hello,

18 messages 2013/06/03

[#407946] Is rubyquiz.com dead? — Alphonse 23 <lists@...>

Thread title says everything.

18 messages 2013/06/04

[#408012] Need help understanding recursion. — pedro oliva <lists@...>

Ive been reading Chris Pine's book 'Learn to Program' and its been going

11 messages 2013/06/06

[#408129] Getting Started With Development — Chamila Wijayarathna <cdwijayarathna@...>

I'm new to Ruby Development. I downloaded source from Github, but couldn't

24 messages 2013/06/11
[#408131] Re: Getting Started With Development — Per-erik Martin <lists@...> 2013/06/11

Ruby is often installed on linux, or can be easily installed with the

[#408146] Re: Getting Started With Development — "Chamila W." <lists@...> 2013/06/11

Per-erik Martin wrote in post #1112021:

[#408149] Re: Getting Started With Development — "Carlo E. Prelz" <fluido@...> 2013/06/11

Subject: Re: Getting Started With Development

[#408198] NokoGiri XML Parser — "Devender P." <lists@...>

Hi,

11 messages 2013/06/13

[#408201] trying to load a .rb file in irb — "Eric D." <lists@...>

I am trying to load a ruby program into irb and it will not load.

12 messages 2013/06/13

[#408205] Can I use Sinatra to render dynamic pages? — Ruby Student <ruby.student@...>

Hell Team,

18 messages 2013/06/13
[#408219] Re: Can I use Sinatra to render dynamic pages? — Nicholas Van Weerdenburg <vanweerd@...> 2013/06/14

You should be able to do this without JavaScript by using streaming.

[#408228] Re: Can I use Sinatra to render dynamic pages? — Ruby Student <ruby.student@...> 2013/06/14

Well, I got some good suggestions from everyone here. I thank you all for

[#408275] Compare and sort one array according to another. — masta Blasta <lists@...>

I have two arrays of objects that look something like this:

14 messages 2013/06/17

[#408276] Comparing objects — "Thom T." <lists@...>

How do I compare two objects in Ruby, considering only attributes

15 messages 2013/06/17

[#408307] getting the most out of Ruby — robin wood <lists@...>

I write a lot of scripts in Ruby, most are small simple things but some

13 messages 2013/06/18

[#408309] Creating ruby script exe — Rochit Sen <lists@...>

Hi All,

17 messages 2013/06/18

[#408357] Beginners problem with database and datamapper — cristian cristian <lists@...>

Hi all!

28 messages 2013/06/20

[#408437] How do I input a variable floating point number into Ruby Programs — "Michael P F." <lists@...>

I want to evaluate the following interactively:

10 messages 2013/06/23

[#408518] #!/usr/bin/env: No such file or directory — Todd Sterben <lists@...>

I am new to both linux and ruby. I am using Ubuntu and Ruby 1.9

17 messages 2013/06/27

[#408528] Designing a Cabinet class — Mike Vezzani <lists@...>

Hello all,

12 messages 2013/06/27

[#408561] Find elment in array of hashes — Rodrigo Lueneberg <lists@...>

array = {:id=>1, :price =>0.25} # index[0]

23 messages 2013/06/28

Re: Sum method through while loops or iteration

From: Tamara Temple <tamouse.lists@...>
Date: 2013-06-25 08:32:53 UTC
List: ruby-talk #408479
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.

I applaud all efforts to learn how things work. That said, there is a
method which does this already: inject/reduce (they are synonyms).

But let's look at what you're doing.

> Thanks for your help!
> 1.
> def sum (array)

The method accepts an array passed in local variable `array`.
> 
> array = []

You destroy any information you've passed in `array` by resetting it here.

> while array >0

This construction makes little sense, as an Array (`array` is an
instance of the Array class) cannot be compared to a Fixnum (which is
what 0 is.)

But then:

> array.each { |a| sum+=a }

You use another loop to run through `array`. This is probably what you
mean entirely and there is no need for an outer while loop.

However, the local variable `sum` is declared implicitly inside the
block {|a| sum+=a}. There are two problems here:

1. `sum` is initially nil, and nil does not accept += (or +)
2. `sum` will not be available outside the block

> end
> 
> 2.
> 
> def sum
> x= []

This time, you aren't overwriting any method input, but you also
hardwire the `x` array to an empty array. Not a very useful method.

> x.each{|element| element +element }

More problems here. You've omitted the egregious while loop, which is
good. But your block is not doing anything in particular. The current
element in `x` is added to itself, but isn't stored anywhere.

Trying this out in irb:

2.0.0p195 :001 > x = (1..10).to_a
 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
2.0.0p195 :002 > x.each{|e| e+e}
 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
2.0.0p195 :003 > 

To see what's happening inside the block, let's add `tap`:

2.0.0p195 :003 > x.each{|e| (e+e).tap{|t| puts "tapped e+e: #{t}"} }
tapped e+e: 2
tapped e+e: 4
tapped e+e: 6
tapped e+e: 8
tapped e+e: 10
tapped e+e: 12
tapped e+e: 14
tapped e+e: 16
tapped e+e: 18
tapped e+e: 20
 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

Probably not what you wanted.


>   end
> 
> 3.
> def sum(array)
> 
>   while array.length > 0

This may seem like it should work, but you are not actually changing the
length of `array` so it should go on forever.

>     puts "#{array[x+y+z]}"

This is insteresting, but where do you define the variables `x`, `y`,
and `z`? This should have elicited an error message straight away.

>   else
>     puts "0"

There was no `end` in this block.



Let's drop back a second and just look at the algorithm one can use to
find the sum of number in an array. No ruby, just pseudo-code.

Given an array of numeric elements,
When I initialize a sum variable to zero,
And I loop through the array with an index,
And I add the value of the array element at the current index to the sum
variable,
Then I will have the sum of the elements in the array.

Someone's already given the inject/reduce version:

(using x from before)

2.0.0p195 :007 > x.inject(:+)
 => 55 

But let's look at this in a method:

=== sum.rb
def sum(a) # Given an array of numeric elements,
  sum = 0 # When I initialize a sum variable to zero,
  a.each_index do |i| # And I loop through array with an index,
    sum += a[i] # And I add the value of the array element
                # at the current index to the sum
                # variable,
  end
  sum # Then I will have the sum of the elements in the array.
end
===
  
2.0.0p195 :010 > def sum(a) ; sum=0;a.each_index{|i| sum+=a[i]}; sum; end
 => nil 
2.0.0p195 :011 > sum x
 => 55 

There's at least a dozen ways to write this; this is but one. Comparing
the method sum to inject, I much prefer inject.



In This Thread