From: botp on
On Mon, May 31, 2010 at 4:34 PM, Robert Klemme
<shortcutter(a)googlemail.com> wrote:
> 2010/5/31 botp <botpena(a)gmail.com>:
>> On Mon, May 31, 2010 at 9:04 AM, Bug Free <amberarrow(a)yahoo.com> wrote:
>>> The following line:
>>>
>>>    [5, 7].each_with_index.each_cons(2) {|v| p v }
>>>
>>> prints [5, 7] but I'm expecting [[5, 0], [7, 1]].
>>
>> you'll have specify the index, eg,
>>
>>>>  [5, 7].map.with_index{|v,i| [v,i]}
>> => [[5, 0], [7, 1]]
>
> That's not the proper replacement with map.  Rather you'd do:
>
> irb(main):009:0> [5, 7].each_with_index.map {|v| v }
> => [5, 7]
> irb(main):010:0> [5, 7].each_with_index.map {|*v| v }
> => [[5, 0], [7, 1]]

brain dead here.
can you enlighten me on what is "not proper" ? :)

ie why is each_with_index.map preferable over map.with_index ?

kind regards -botp

From: Robert Klemme on
2010/5/31 botp <botpena(a)gmail.com>:
> On Mon, May 31, 2010 at 4:34 PM, Robert Klemme
> <shortcutter(a)googlemail.com> wrote:
>> 2010/5/31 botp <botpena(a)gmail.com>:
>>> On Mon, May 31, 2010 at 9:04 AM, Bug Free <amberarrow(a)yahoo.com> wrote:
>>>> The following line:
>>>>
>>>>    [5, 7].each_with_index.each_cons(2) {|v| p v }
>>>>
>>>> prints [5, 7] but I'm expecting [[5, 0], [7, 1]].
>>>
>>> you'll have specify the index, eg,
>>>
>>>>>  [5, 7].map.with_index{|v,i| [v,i]}
>>> => [[5, 0], [7, 1]]
>>
>> That's not the proper replacement with map.  Rather you'd do:
>>
>> irb(main):009:0> [5, 7].each_with_index.map {|v| v }
>> => [5, 7]
>> irb(main):010:0> [5, 7].each_with_index.map {|*v| v }
>> => [[5, 0], [7, 1]]
>
> brain dead here.
> can you enlighten me on what is "not proper" ?  :)
>
> ie why is each_with_index.map preferable over map.with_index ?

Because it is closer on what OP initially did:

[5, 7].each_with_index.each_cons(2) {|v| p v }

The sequence "[5, 7].each_with_index" returns an Enumerator which must
yield a value and an index on each iteration:

irb(main):001:0> [5, 7].each_with_index.each {|*a| p a}
[5, 0]
[7, 1]
=> [5, 7]

On this Enumerator which #each_cons is invoked.

Contrast that to your suggestion "[5, 7].map.with_index{|v,i| [v,i]}":
here "[5, 7].map" returns an Enumerator which must yield values *only*
- the index is added by "#map_with_index".

irb(main):002:0> [5, 7].map.each {|*a| p a}
[5]
[7]
=> [[5], [7]]

This means that in your code the index cannot get lost along the way
simply because it is added in the last step and not in the initial
step. Hope it's clearer now.

Kind regards

robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

From: Bug Free on
Robert Dober wrote:
> On Mon, May 31, 2010 at 10:34 AM, Robert Klemme
> <shortcutter(a)googlemail.com> wrote:
>> I'd say it's a bug which seems to be reflected by the fact that it
>> works as expected in 1.9.3 according to Caleb.
> Even more so, as
> [5, 7].each_with_index.to_a.each_cons(2) {|v| p v }
> [[5, 0], [7, 1]]
>
> Seems quite straight forward to me that the to_a should not change the
> semantics.
> R.

Thanks for all the responses. Where do I pick up 1.9.3 ? I don't see it
at ftp://ftp.ruby-lang.org/pub/ruby/1.9

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

From: Bug Free on
Robert Dober wrote:
> On Mon, May 31, 2010 at 10:34 AM, Robert Klemme
> <shortcutter(a)googlemail.com> wrote:
>> I'd say it's a bug which seems to be reflected by the fact that it
>> works as expected in 1.9.3 according to Caleb.
> Even more so, as
> [5, 7].each_with_index.to_a.each_cons(2) {|v| p v }
> [[5, 0], [7, 1]]
>
> Seems quite straight forward to me that the to_a should not change the
> semantics.
> R.

Just checked the just-released 1.9.2-preview3 and it too seems to have
the fix.
--
Posted via http://www.ruby-forum.com/.

From: botp on
On Mon, May 31, 2010 at 9:53 PM, Robert Klemme
<shortcutter(a)googlemail.com> wrote:
> Because it is closer on what OP initially did:

LOL. ok i get it :)
i was just pointing out how to retrieve the index (and the relevance
of it). i wouldn't want to "give" him *the* answer because i think
rubyist _are_ programmers...

kind regards -botp

> irb(main):001:0> [5, 7].each_with_index.each {|*a| p a}
> [5, 0]
> [7, 1]
> => [5, 7]

or simply,

=> [5, 7].each_with_index{|*a| p a}
[5, 0]
[7, 1]
=> [5, 7]


> This means that in your code the index cannot get lost along the way
> simply because it is added in the last step and not in the initial
> step.

shouldn't the programmer be the judge for that?

eg, i can easily scale if i need the square and the index...

> [5, 7].map{|a| a*a }.each_with_index{|*a| p a}
[25, 0]
[49, 1]

> Kind regards
> robert

best regards
-botp