Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Enumerable Integer? Nah. Integer#times Enumerator!

Reply
Thread Tools

Enumerable Integer? Nah. Integer#times Enumerator!

 
 
Trans
Guest
Posts: n/a
 
      12-27-2007
Just a little FYI.

Not too long ago I noted this suggestion:

class Integer
alias_method :each, :times
include Enumerable
end

Which is kind of cool in that allows some convenient statements like

10.collect { |i| "No. #{i}" }
10.select { |i| i % 3 == 0 }

And so forth. This is nice, but, of course, the downside is that this
clutters up Integer with all these Enumerable methods.

Thankfully, and this is the FYI, Ruby 1.9 has Integer#times returning
an Enumerator. So most of these same functionality can be had just by
inserting #times in between:

10.times.collect { |i| "No. #{i}" }
10.times.select { |i| i % 3 == 0 }

This is great IMHO, so I thought I'd share. My only aside is the
thought that perhaps there's still a good reason to add Integer#to_a --
to save us the intermediate object of times.to_a. Or is that too much
of a YAGNI?

T.

 
Reply With Quote
 
 
 
 
George
Guest
Posts: n/a
 
      12-28-2007
On Dec 28, 2007 8:55 AM, Trans <(E-Mail Removed)> wrote:
> Just a little FYI.
>
> Not too long ago I noted this suggestion:
>
> class Integer
> alias_method :each, :times
> include Enumerable
> end
>
> Which is kind of cool in that allows some convenient statements like
>
> 10.collect { |i| "No. #{i}" }
> 10.select { |i| i % 3 == 0 }
>
> And so forth. This is nice, but, of course, the downside is that this
> clutters up Integer with all these Enumerable methods.
>
> Thankfully, and this is the FYI, Ruby 1.9 has Integer#times returning
> an Enumerator. So most of these same functionality can be had just by
> inserting #times in between:
>
> 10.times.collect { |i| "No. #{i}" }
> 10.times.select { |i| i % 3 == 0 }
>
> This is great IMHO, so I thought I'd share. My only aside is the
> thought that perhaps there's still a good reason to add Integer#to_a --
> to save us the intermediate object of times.to_a. Or is that too much
> of a YAGNI?


Hi Trans,

Thanks for the FYI. For what it's worth, I can't say I'm really a fan
of 10.times.select--it doesn't seem very clear to me what's being
iterated over. 10.select even less so. I think good ol'
(0...10).select looks better. *shrug*

Similarly, 10.to_a returning [0,1,...,9] doesn't really feel right to
me. In fact, I'd probably expect 10.to_a to do the same as Array(10)
(and changing the latter may well break things).

Just my thoughts.

Regards,
George.

 
Reply With Quote
 
 
 
 
Robert Klemme
Guest
Posts: n/a
 
      12-28-2007
2007/12/27, Trans <(E-Mail Removed)>:
> Just a little FYI.
>
> Not too long ago I noted this suggestion:
>
> class Integer
> alias_method :each, :times
> include Enumerable
> end
>
> Which is kind of cool in that allows some convenient statements like
>
> 10.collect { |i| "No. #{i}" }
> 10.select { |i| i % 3 == 0 }
>
> And so forth. This is nice, but, of course, the downside is that this
> clutters up Integer with all these Enumerable methods.


Well, in the old days (1.8.x) you could do this which does not look
too different from the 1.9 solution you show below

10.to_enum(:times).collect { |i| "No. #{i}" }
10.to_enum(:times).select { |i| i % 3 == 0 }

> Thankfully, and this is the FYI, Ruby 1.9 has Integer#times returning
> an Enumerator. So most of these same functionality can be had just by
> inserting #times in between:
>
> 10.times.collect { |i| "No. #{i}" }
> 10.times.select { |i| i % 3 == 0 }
>
> This is great IMHO, so I thought I'd share. My only aside is the
> thought that perhaps there's still a good reason to add Integer#to_a --
> to save us the intermediate object of times.to_a. Or is that too much
> of a YAGNI?


I'd rather use 10.times.to_a instead of 10.to_a because the latter
seems too unobvious to me.

Kind regards

robert

--
use.inject do |as, often| as.you_can - without end

 
Reply With Quote
 
Trans
Guest
Posts: n/a
 
      12-28-2007


On Dec 28, 12:01 pm, "Robert Klemme" <(E-Mail Removed)>
wrote:

> I'd rather use 10.times.to_a instead of 10.to_a because the latter
> seems too unobvious to me.


Understandable. But obvious isn't always the most important factor. A
straight #to_a is vastly more efficient.

T.

 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      12-29-2007
On 28.12.2007 19:30, Trans wrote:
>
> On Dec 28, 12:01 pm, "Robert Klemme" <(E-Mail Removed)>
> wrote:
>
>> I'd rather use 10.times.to_a instead of 10.to_a because the latter
>> seems too unobvious to me.

>
> Understandable. But obvious isn't always the most important factor. A
> straight #to_a is vastly more efficient.


Good point. I'd like to point out that the overhead completely depends
on the number where #to_a is invoked on. For small numbers the overhead
is likely significant. But for large numbers, especially BigNums I'd
say the overhead is negligible. But I guess, in reality this would be
more often used with rather smallish numbers. So yes, this should be
taken into account.

Kind regards

robert
 
Reply With Quote
 
Rick DeNatale
Guest
Posts: n/a
 
      12-29-2007
On Dec 28, 2007 1:30 PM, Trans <(E-Mail Removed)> wrote:
>
>
> On Dec 28, 12:01 pm, "Robert Klemme" <(E-Mail Removed)>
> wrote:
>
> > I'd rather use 10.times.to_a instead of 10.to_a because the latter
> > seems too unobvious to me.

>
> Understandable. But obvious isn't always the most important factor. A
> straight #to_a is vastly more efficient.


Keep in mind that in 1.8

10.to_a #=> [10]

which also gives a deprecation warning, because in 1.9 Object#to_a and
several other implementations of to_a have been removed.




--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Enumerable methods returning Enumerable (was: ruby-dev suumary 26862-26956) Daniel Sheppard Ruby 0 09-16-2005 02:40 AM
An addition to Array (or Enumerable)? Harry Ohlsen Ruby 11 12-29-2003 02:05 PM
Support for arbitrary iterators in Enumerable? Pierre-Charles David Ruby 2 11-20-2003 02:34 PM
Enumerable#inject is surprising me... Nathaniel Talbott Ruby 0 10-06-2003 11:29 PM
Why isn't Enumerable in StringIO? Jason Creighton Ruby 1 07-26-2003 05:14 AM



Advertisments