# Enumerator in ruby 1.9

**URL:** <https://www.ruby-forum.com/t/enumerator-in-ruby-1-9/131803>\
**Category:** Ruby\
**Created:** [March 13, 2008, 12:20pm UTC](https://www.ruby-forum.com/t/enumerator-in-ruby-1-9/131803 "2008-03-13T12:20:29Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Artem\_V](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/3be4f8/32.png) [@Artem\_V](https://www.ruby-forum.com/u/Artem_V)\
**Post date:** [March 13, 2008, 12:20pm UTC](https://www.ruby-forum.com/t/enumerator-in-ruby-1-9/131803/1 "2008-03-13T12:20:29Z")

</div>

# One could write

module Enumerable  
def sum  
inject(0) {|f,x| f+x}  
end  
end

# And we have

puts [1,2,3,4].sum # =\> 10

# But it works only for numbers.

# I would like to write more general code:

module Enumerable  
def sum  
each.skip\_first.inject(first) {|f,x| f+x}  
end  
end

# so we have:

## puts [1,2,3,4].sum #=\> 10 puts [‘a’,‘b’,‘c’].sum #=\> ‘abc’

1. Is it a good idea to add method '‘first’ to Enumerable?
2. Please, show me the _right_ code for Enumerator#skip\_first(n=1)  
(ruby1.9)

Thanks!

---

<div class="post-metadata">

**Author:** ![Artem\_V](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/3be4f8/32.png) [@Artem\_V](https://www.ruby-forum.com/u/Artem_V)\
**Post date:** [March 13, 2008, 12:28pm UTC](https://www.ruby-forum.com/t/enumerator-in-ruby-1-9/131803/2 "2008-03-13T12:28:47Z")

</div>

Hi –

On Thu, 13 Mar 2008, Artem V. wrote:

> # But it works only for numbers.
> 
> ## puts [‘a’,‘b’,‘c’].sum #=\> ‘abc’
> 
> 1. Is it a good idea to add method '‘first’ to Enumerable?
> 2. Please, show me the _right_ code for Enumerator#skip\_first(n=1) (ruby1.9)

If you don’t give an argument to inject, it uses the first element in  
the collection. So you can just do:

%w{a b c}.inject {|acc,e| acc + e }

David

---

<div class="post-metadata">

**Author:** ![Artem\_V](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/3be4f8/32.png) [@Artem\_V](https://www.ruby-forum.com/u/Artem_V)\
**Post date:** [March 13, 2008, 12:34pm UTC](https://www.ruby-forum.com/t/enumerator-in-ruby-1-9/131803/3 "2008-03-13T12:34:07Z")

</div>

Sorry, I’ve found than ‘inject’ has form without argument and it does  
the job.

module Enumerable  
def sum  
inject {|f,x| f+x}  
end  
end

But i am still interested in:

1. Is it a good idea to add method '‘first’ to Enumerable?
2. Please, show me the _right_ code for Enumerator#skip\_first(n=1)  
(ruby1.9)

And one more question offtopic:

I see my messages duplicated in list. I use [gmail.com](http://gmail.com)  
What should I do to stop duplicating my messages?

---

<div class="post-metadata">

**Author:** ![Artem\_V](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/3be4f8/32.png) [@Artem\_V](https://www.ruby-forum.com/u/Artem_V)\
**Post date:** [March 13, 2008, 12:47pm UTC](https://www.ruby-forum.com/t/enumerator-in-ruby-1-9/131803/4 "2008-03-13T12:47:40Z")

</div>

On Thu, Mar 13, 2008 at 12:33 PM, Artem V.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> And one more question offtopic:
> 
> I see my messages duplicated in list. I use [gmail.com](http://gmail.com)

I assume the following: You send a message to the ruby-talk, GMail  
saves a copy in the conversation, ruby-talk sends you your email.  
Not sure if it is like that, but that’s how I explain it to me.

> What should I do to stop duplicating my messages?

I am using Better GMail and delete my duplicated emails when I decide  
to archive a ruby-talk conversation.

---

<div class="post-metadata">

**Author:** ![Artem\_V](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/3be4f8/32.png) [@Artem\_V](https://www.ruby-forum.com/u/Artem_V)\
**Post date:** [March 13, 2008, 1:44pm UTC](https://www.ruby-forum.com/t/enumerator-in-ruby-1-9/131803/5 "2008-03-13T13:44:17Z")

</div>

For example

* * *

module Enumerable  
class Enumerator  
def skip\_first(n=1)  
n.times {puts “Skiping #{self.next}”}  
self  
end  
end  
end

## puts [1,2,3,4].each.skip\_first(2).map{|i| i}

Outputs

Skiping 1  
Skiping 2  
1  
2  
3  
4

(ruby 1.9.0 (2007-12-25 revision 14709) [i386-mswin32])

So it does not skips in fact. Enumerator restarts inside method map.  
It looks strange for me.

Can anyone help me to write ‘skip\_first’ method that works?

Artem

---

<div class="post-metadata">

**Author:** ![Artem\_V](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/3be4f8/32.png) [@Artem\_V](https://www.ruby-forum.com/u/Artem_V)\
**Post date:** [March 13, 2008, 1:52pm UTC](https://www.ruby-forum.com/t/enumerator-in-ruby-1-9/131803/6 "2008-03-13T13:52:00Z")

</div>

On Mar 13, 2008, at 6:33 AM, Artem V. wrote:

> But i am still interested in:
> 
> 1. Is it a good idea to add method '‘first’ to Enumerable?

You can use Ruby 1.9’s take() for this:

$ ruby\_dev -ve ‘p((1…10).take(1).first)’  
ruby 1.9.0 (2008-03-01 revision 15664) [i686-darwin9.2.0]  
1

> 1. Please, show me the _right_ code for Enumerator#skip\_first(n=1)  
> (ruby1.9)

Use take()'s cousin drop():

$ ruby\_dev -ve ‘p((1…10).drop(1))’  
ruby 1.9.0 (2008-03-01 revision 15664) [i686-darwin9.2.0]  
[2, 3, 4, 5, 6, 7, 8, 9, 10]

James Edward G. II

---

<div class="post-metadata">

**Author:** ![Artem\_V](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/3be4f8/32.png) [@Artem\_V](https://www.ruby-forum.com/u/Artem_V)\
**Post date:** [March 13, 2008, 2:13pm UTC](https://www.ruby-forum.com/t/enumerator-in-ruby-1-9/131803/7 "2008-03-13T14:13:22Z")

</div>

2008/3/13, James G. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 1

Thanks.

> James Edward G. II

I want to have ‘drop’ for Enumerator so that no new collection was  
created.  
It’s important when collection is big one.
