mischa
January 29, 2009, 6:22am
1
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
mischa
January 29, 2009, 6:55am
2
On Thu, Jan 29, 2009 at 12:19 AM, Mischa F. [email protected]
wrote:
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
mischa
January 29, 2009, 6:59am
3
On Thu, Jan 29, 2009 at 12:53 AM, Gregory B.
[email protected] 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/euler_67.html
mischa
January 29, 2009, 7:50am
4
On Thu, Jan 29, 2009 at 1:15 AM, Mischa F. [email protected]
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.
committed 05:54AM - 29 Jan 09 UTC
mischa
January 29, 2009, 9:09am
5
2009/1/29 Mischa F. [email protected] :
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&whence=0
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
mischa
January 29, 2009, 7:17am
6
Gregory B. wrote:
On Thu, Jan 29, 2009 at 12:53 AM, Gregory B.
[email protected] 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/euler_67.html
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
mischa
June 25, 2011, 12:37pm
7
each_cons just saved me an unpleasant headache. I use it together with
each_line to implement file parsing with lookahead:
f.each_line.each_cons(2) do |line, next_line|
…
end