[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Real life use of each_cons?

Mischa Fierer

1/29/2009 5:20:00 AM

Hello,

I've been going through the enumerable/enumerator methods that I'm
unfamiliar with and came across each_cons. Apart from a post by a guy
who wasn't sure where it was even defined, I have only come across one
use of it in the wild:

(From Prawn)

def polygon(*points)
move_to points[0]
(points << points[0]).each_cons(2) do |p1,p2|
line_to(*p2)
end
end


Does anyone have any ideas on other cases where each_cons would be
useful? Or perhaps insight into why it's in Ruby?

Best,

M
--
Posted via http://www.ruby-....

5 Answers

Gregory Brown

1/29/2009 5:51:00 AM

0

On Thu, Jan 29, 2009 at 12:19 AM, Mischa Fierer <f.mischa@gmail.com> wrote:
> Hello,
>
> I've been going through the enumerable/enumerator methods that I'm
> unfamiliar with and came across each_cons. Apart from a post by a guy
> who wasn't sure where it was even defined, I have only come across one
> use of it in the wild:
>
> (From Prawn)
>
> def polygon(*points)
> move_to points[0]
> (points << points[0]).each_cons(2) do |p1,p2|
> line_to(*p2)
> end
> end
>
>
> Does anyone have any ideas on other cases where each_cons would be
> useful? Or perhaps insight into why it's in Ruby?

I think you may have been confused by my ugly code there. I have
replaced it with:

def polygon(*points)
move_to points[0]
(points[1..-1] << points[0]).each do |point|
line_to(*point)
end
end

The reason why it's not needed is because we draw the lines from point to point.

But if we were drawing them segment by segment, it'd make sense.

>> [[1,2],[3,4],[5,6],[1,2]].each_cons(2) { |a| p a }
[[1, 2], [3, 4]]
[[3, 4], [5, 6]]
[[5, 6], [1, 2]]

I imagine I had refactored a line p1, p2 call down to just line_to(p2)
without fixing the each_cons()... sorry about that.

In general each_cons is useful when you need a sliding window of size
n across a dataset.

-greg

--
Technical Blaag at: http://blog.majesticseacr...
Non-tech stuff at: http://metametta.bl...
"Ruby Best Practices" Book now in O'Reilly Roughcuts:
http://rubybestpra...

Gregory Brown

1/29/2009 5:56:00 AM

0

On Thu, Jan 29, 2009 at 12:53 AM, Gregory Brown
<gregory.t.brown@gmail.com> wrote:
> On Thu, Jan 29, 2009 at 12:19 AM, Mischa Fierer <f.mischa@gmail.com> wrote:
>> Hello,
>>
>> I've been going through the enumerable/enumerator methods that I'm
>> unfamiliar with and came across each_cons. Apart from a post by a guy
>> who wasn't sure where it was even defined, I have only come across one
>> use of it in the wild:
>>
>> (From Prawn)
>>
>> def polygon(*points)
>> move_to points[0]
>> (points << points[0]).each_cons(2) do |p1,p2|
>> line_to(*p2)
>> end
>> end
>>
>>
>> Does anyone have any ideas on other cases where each_cons would be
>> useful? Or perhaps insight into why it's in Ruby?

Here's a more reasonable usage, for solving a simple tree-traversal problem:
http://blog.majesticseacr.../archives/2008.10/eul...

--
Technical Blaag at: http://blog.majesticseacr...
Non-tech stuff at: http://metametta.bl...
"Ruby Best Practices" Book now in O'Reilly Roughcuts:
http://rubybestpra...

Mischa Fierer

1/29/2009 6:15:00 AM

0

Gregory Brown wrote:
> On Thu, Jan 29, 2009 at 12:53 AM, Gregory Brown
> <gregory.t.brown@gmail.com> wrote:
>>> def polygon(*points)
>>> move_to points[0]
>>> (points << points[0]).each_cons(2) do |p1,p2|
>>> line_to(*p2)
>>> end
>>> end
>>>
>>>
>>> Does anyone have any ideas on other cases where each_cons would be
>>> useful? Or perhaps insight into why it's in Ruby?
>
> Here's a more reasonable usage, for solving a simple tree-traversal
> problem:
> http://blog.majesticseacreature.com/archives/2008.10/eul...

Interesting. Thanks a bunch Gregory. Traversal had occurred to me as a
possible use, but I wasn't sure.

Also, it seems that if you refactor prawn, there will be no actual usage
of each_cons on github, apart from the ruby projects of course!

M
--
Posted via http://www.ruby-....

Gregory Brown

1/29/2009 6:47:00 AM

0

On Thu, Jan 29, 2009 at 1:15 AM, Mischa Fierer <f.mischa@gmail.com> wrote:

> Also, it seems that if you refactor prawn, there will be no actual usage
> of each_cons on github, apart from the ruby projects of course!

Already done.

http://github.com/sandal/prawn/commit/7c68dadeae3c89822a6ab0713af435...

--
Technical Blaag at: http://blog.majesticseacr...
Non-tech stuff at: http://metametta.bl...
"Ruby Best Practices" Book now in O'Reilly Roughcuts:
http://rubybestpra...

Robert Klemme

1/29/2009 8:06:00 AM

0

2009/1/29 Mischa Fierer <f.mischa@gmail.com>:
> Hello,
>
> I've been going through the enumerable/enumerator methods that I'm
> unfamiliar with and came across each_cons. Apart from a post by a guy
> who wasn't sure where it was even defined, I have only come across one
> use of it in the wild:
>
> (From Prawn)
>
> def polygon(*points)
> move_to points[0]
> (points << points[0]).each_cons(2) do |p1,p2|
> line_to(*p2)
> end
> end
>
>
> Does anyone have any ideas on other cases where each_cons would be
> useful? Or perhaps insight into why it's in Ruby?

You can find some uses in this mailing list's archive:

http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb?key=each_cons&cginame=namazu.rb&submit=Search&dbname=ruby-talk&max=50&am...

Useful applications are those where you need a moving window over a
collection of data, for example when calculating moving averages
(smoothing a plot) or distances between adjacent values.

Kind regards

robert

--
remember.guy do |as, often| as.you_can - without end