Collect! and Enumerable

Hi

I just noticed that Enumerable does not support collect! although
it does support collect. Was this changed from earlier versions?
If so, why?

irb(main):001:0> class M
irb(main):002:1> def each
irb(main):003:2> yield 1
irb(main):004:2> yield 2
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> class M
irb(main):008:1> include Enumerable
irb(main):009:1> end
=> M
irb(main):010:0> m=M.new
=> #<M:0x1892d0>
irb(main):011:0> m.collect { |i| i2 }
=> [2, 4]
irb(main):012:0> m.collect! { |i| i
2 }
NoMethodError: undefined method `collect!’ for #<M:0x1892d0>
from (irb):12

Thanks

···


Jim Freeze

“When in doubt, tell the truth.”
– Mark Twain

Does collect! (or map!) make sense for Enumerables? Keep in mind that
collect! (aka map!) is defined in Array.
I guess you could define it as
module Enumerable
def collect!(&b)
to_a.collect!(&b)
end
end
but I don’t feel too bad about having to do to_a explicitly.

···

On Thu, Jan 15, 2004 at 12:47:24AM +0900, Jim Freeze wrote:

Hi

I just noticed that Enumerable does not support collect! although
it does support collect. Was this changed from earlier versions?
If so, why?

irb(main):001:0> class M
irb(main):002:1> def each
irb(main):003:2> yield 1
irb(main):004:2> yield 2
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> class M
irb(main):008:1> include Enumerable
irb(main):009:1> end
=> M
irb(main):010:0> m=M.new
=> #<M:0x1892d0>
irb(main):011:0> m.collect { |i| i2 }
=> [2, 4]
irb(main):012:0> m.collect! { |i| i
2 }
NoMethodError: undefined method `collect!’ for #<M:0x1892d0>
from (irb):12


_ _

__ __ | | ___ _ __ ___ __ _ _ __
'_ \ / | __/ __| '_ _ \ / ` | ’ \
) | (| | |
__ \ | | | | | (| | | | |
.__/ _,
|_|/| || ||_,|| |_|
Running Debian GNU/Linux Sid (unstable)
batsman dot geo at yahoo dot com

There are 3 kinds of people: those who can count & those who can’t.
– Unknown source

A. collect always returns an array.

B. Bang methods should not change the class of the receiver.

.
. .

C. Non-array enumerables should not implement #collect!

I don’t believe this changed between versions.

Gavin

···

On Thursday, January 15, 2004, 2:47:24 AM, Jim wrote:

Hi

I just noticed that Enumerable does not support collect! although
it does support collect. Was this changed from earlier versions?
If so, why?

“Mauricio Fernández” batsman.geo@yahoo.com schrieb im Newsbeitrag
news:20040114155507.GA17702@student.ei.uni-stuttgart.de

···

On Thu, Jan 15, 2004 at 12:47:24AM +0900, Jim Freeze wrote:

Hi

I just noticed that Enumerable does not support collect! although
it does support collect. Was this changed from earlier versions?
If so, why?

irb(main):001:0> class M
irb(main):002:1> def each
irb(main):003:2> yield 1
irb(main):004:2> yield 2
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> class M
irb(main):008:1> include Enumerable
irb(main):009:1> end
=> M
irb(main):010:0> m=M.new
=> #<M:0x1892d0>
irb(main):011:0> m.collect { |i| i2 }
=> [2, 4]
irb(main):012:0> m.collect! { |i| i
2 }
NoMethodError: undefined method `collect!’ for #<M:0x1892d0>
from (irb):12

Does collect! (or map!) make sense for Enumerables? Keep in mind that
collect! (aka map!) is defined in Array.
I guess you could define it as
module Enumerable
def collect!(&b)
to_a.collect!(&b)
end
end
but I don’t feel too bad about having to do to_a explicitly.

Especially since your definition of collect! would defy users’
expectations that it would do it in place while it really creates a copy.
:slight_smile:

Regards

robert

that’s why “Does collect! (or map!) make sense for Enumerables?”,
but you expressed it so much better :wink:

···

On Thu, Jan 15, 2004 at 01:11:41AM +0900, Robert Klemme wrote:

Does collect! (or map!) make sense for Enumerables? Keep in mind that
collect! (aka map!) is defined in Array.
I guess you could define it as
module Enumerable
def collect!(&b)
to_a.collect!(&b)
end
end
but I don’t feel too bad about having to do to_a explicitly.

Especially since your definition of collect! would defy users’
expectations that it would do it in place while it really creates a copy.
:slight_smile:


_ _

__ __ | | ___ _ __ ___ __ _ _ __
'_ \ / | __/ __| '_ _ \ / ` | ’ \
) | (| | |
__ \ | | | | | (| | | | |
.__/ _,
|_|/| || ||_,|| |_|
Running Debian GNU/Linux Sid (unstable)
batsman dot geo at yahoo dot com

And Bruce is effectively building BruceIX
– Alan Cox

“Mauricio Fernández” batsman.geo@yahoo.com schrieb im Newsbeitrag
news:20040114161617.GA20817@student.ei.uni-stuttgart.de

Does collect! (or map!) make sense for Enumerables? Keep in mind
that
collect! (aka map!) is defined in Array.
I guess you could define it as
module Enumerable
def collect!(&b)
to_a.collect!(&b)
end
end
but I don’t feel too bad about having to do to_a explicitly.

Especially since your definition of collect! would defy users’
expectations that it would do it in place while it really creates a
copy.
:slight_smile:

that’s why “Does collect! (or map!) make sense for Enumerables?”,
but you expressed it so much better :wink:

Err, no. Apparently you wanted to say the same as I did but I was tricked
into believing something else by “I guess you could define it as …”.
Sounded like a positive suggestion to me. Now, who said English was easy?
:slight_smile:

Kind regards

robert
···

On Thu, Jan 15, 2004 at 01:11:41AM +0900, Robert Klemme wrote: