Easy task, Sum array element... Why doesn't it work?

I have done it many times before, but this time I can't get it too work.
I'm starting to get a bit frustrating.
So, I'm trying to sum all elements from the second element in a Array
using inject. The problem is that inject returns nil every time. What am
I doing wrong?

parameters.each {|element| print element + ","} --> ?faq,using,rtorrent
parameters.each {|element| print element.class.to_s + ","} -->
String,String,String
parameters.class --> Array

Doesn't work.
(parameters[1]..parameters[-1]).inject {|result, element| result +
element} --> nil
Neither does.
(parameters[1]..parameters[-1]).to_a.inject {|result, element| result +
element} --> nil

//Walle

···

--
Posted via http://www.ruby-forum.com/.

Walle Wallen wrote:

Doesn't work.
(parameters[1]..parameters[-1]).inject {|result, element| result +

That's creating a new Range object: ("faq".."rtorrent")

What you want is an array slice:

   parameters[1..-1].inject ...

···

--
Posted via http://www.ruby-forum.com/\.

Rails has this by default:
http://api.rubyonrails.org/classes/Enumerable.html#M002571

module Enumerable
  def sum(identity = 0, &block)
    return identity unless size > 0

    if block_given?
      map(&block).sum
    else
      inject { |sum, element| sum + element }
    end
  end
end

['a','b','c'].sum # => "abc"
[1,2,3].sum # => 6
[[0],['0'],[:'0'],[/0/]].sum # => [0, "0", :"0", /0/]
.sum(/abc/) # => /abc/
[1,2,3].sum(/abc/) # => 6
['a','b','c'].sum(&:upcase) # => "ABC"

That last one is 1.9 only (or another monkey patch :stuck_out_tongue_winking_eye: )

···

On Mon, Mar 29, 2010 at 4:26 AM, Walle Wallen <walle.sthlm@gmail.com> wrote:

I have done it many times before, but this time I can't get it too work.
I'm starting to get a bit frustrating.
So, I'm trying to sum all elements from the second element in a Array
using inject. The problem is that inject returns nil every time. What am
I doing wrong?

parameters.each {|element| print element + ","} --> ?faq,using,rtorrent
parameters.each {|element| print element.class.to_s + ","} -->
String,String,String
parameters.class --> Array

Doesn't work.
(parameters[1]..parameters[-1]).inject {|result, element| result +
element} --> nil
Neither does.
(parameters[1]..parameters[-1]).to_a.inject {|result, element| result +
element} --> nil

//Walle
--
Posted via http://www.ruby-forum.com/\.

Brian Candler wrote:

Walle Wallen wrote:

Doesn't work.
(parameters[1]..parameters[-1]).inject {|result, element| result +

That's creating a new Range object: ("faq".."rtorrent")

What you want is an array slice:

   parameters[1..-1].inject ...

Thanks, it worked.

I did a small test in IRB, and it seems like my method should work.
Strange.
a = ["a", "b", "c"]
=> ["a", "b", "c"]

(a[1]..a[-1]).inject {|result, element| entry + result}

=> "bc"

···

--
Posted via http://www.ruby-forum.com/\.

As Brian has explained, (a[1]..[a-1]) creates a range. When you
iterate a range, it calls succ starting on the first element until it
reaches the last one. In your example with a, b, c:

irb(main):006:0> ("a".."c").each {|s| p s}
"a"
"b"
"c"

You get the three elements of the array, by chance. Try changing that
to something else, for example:

irb(main):013:0> array = ["a", "d", "f"]
=> ["a", "d", "f"]
irb(main):014:0> (array[1]..array[-1]).inject {|result, element|
result + element}
=> "def"

In your original example, the words were quite far apart:

irb(main):005:0> ("faq".."rtorrent").each_with_index {|s, i| p s;
break if i > 20}
"faq"
"far"
"fas"
"fat"
"fau"
"fav"
"faw"
"fax"
"fay"
"faz"
"fba"
"fbb"
"fbc"
"fbd"
"fbe"
"fbf"
"fbg"
"fbh"
"fbi"
"fbj"
"fbk"
"fbl"

and so on until "rtorrent".

Jesus.

···

On Mon, Mar 29, 2010 at 12:39 PM, Walle Wallen <walle.sthlm@gmail.com> wrote:

Brian Candler wrote:

Walle Wallen wrote:

Doesn't work.
(parameters[1]..parameters[-1]).inject {|result, element| result +

That's creating a new Range object: ("faq".."rtorrent")

What you want is an array slice:

parameters[1..-1].inject ...

Thanks, it worked.

I did a small test in IRB, and it seems like my method should work.
Strange.
a = ["a", "b", "c"]
=> ["a", "b", "c"]

(a[1]..a[-1]).inject {|result, element| entry + result}

=> "bc"

Thanks Jesus, I get it now.

···

--
Posted via http://www.ruby-forum.com/.

Actually in his original example parameters appears to be ["?faq" ,
"using" , "rtorrent"]

so

(parameters[1]..parameters[-1])

is

("using".."rtorrent")

and since "using" > "rtorrent" the range is empty which is why inject
returns nil.

···

2010/3/29 Jesús Gabriel y Galán <jgabrielygalan@gmail.com>:

On Mon, Mar 29, 2010 at 12:39 PM, Walle Wallen <walle.sthlm@gmail.com> wrote:

In your original example, the words were quite far apart:

irb(main):005:0> ("faq".."rtorrent").each_with_index {|s, i| p s;
break if i > 20}

--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale