Numeric#of


#1

i threw this out before. thought i’d try again:

harp:~ > irb
irb(main):001:0> class Numeric; def of(&b) Array::new(self).map(&b)
end; end
=> nil

irb(main):002:0> 42.of{ String::new }
=> ["", “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”,
“”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”,
“”, “”, “”, “”, “”, “”, “”, “”]

regards.

-a


#2

Hi,

On 2/1/06, removed_email_address@domain.invalid removed_email_address@domain.invalid wrote:

i threw this out before. thought i’d try again:

harp:~ > irb
irb(main):001:0> class Numeric; def of(&b) Array::new(self).map(&b) end; end
=> nil

irb(main):002:0> 42.of{ String::new }
=> ["", “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”]

Using my not-yet-committed 1.9, you can type

42.times.collect{String::new}

to get the same result.

matz.


#3

On 1/31/06, Yukihiro M. removed_email_address@domain.invalid wrote:

42.times.collect{String::new}

to get the same result.

Cool!

So does times still work with a block? I’m assuming that it switches
behavior, being a generator itself if a block is present, and creating
a generator object (which includes Enumerable) when no block is
provided.

Eg. (simplified):

class Numeric
def times( &blk )
generator = # some code to create the generator
# that runs from 0 to self-1
generator.each &blk if block_given?
generator
end
end

If that’s the case, this is awesome!

Jacob F.


#4

All I did was

class Integer
def times
if block_given?
(0…self).each { |i| yield i }
else
(0…self)
end
end
end

3.times.collect { String.new }
=> ["", “”, “”]


#5

On 1/31/06, Matthew M. removed_email_address@domain.invalid wrote:

class Integer
def times
if block_given?
(0…self).each { |i| yield i }
else
(0…self)
end
end
end

Yeah, that’s pretty much the same thing as my pseudo-code if you let
generator = (0…self) which, given the special implementation of
Fixnum ranges, is probably the best solution. Note that it Matz
probably did do it in Fixnum, not Numeric (How would you do something
Math::PI.times? :slight_smile: or Integer.

Jacob F.


#6

On Wed, 1 Feb 2006, Yukihiro M. wrote:

irb(main):002:0> 42.of{ String::new }
=> ["", “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”]

Using my not-yet-committed 1.9, you can type

42.times.collect{String::new}

to get the same result.

great! i’m still partial to the shorter version since

42.times.collect{String::new}

isn’t that much shorter/prettier than my current idiom of

Array::new(42).map{String::new}

but it’s the capability that’s needed so this is good news.

kind regards.

-a


#7

On Wed, 1 Feb 2006, James Edward G. II wrote:

On Jan 31, 2006, at 6:58 PM, removed_email_address@domain.invalid wrote:

Array::new(42).map{String::new}

That can be shortened to:

Array.new(42) { String.new }
=> ["", “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”,
“”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”,
“”, “”, “”, “”, “”]

indeed. my bad.

none still as pretty as ‘42.of’ though! :wink:

-a


#8

On Jan 31, 2006, at 6:58 PM, removed_email_address@domain.invalid wrote:

Array::new(42).map{String::new}

That can be shortened to:

Array.new(42) { String.new }
=> ["", “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”,
“”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”,
“”, “”, “”, “”, “”, “”, “”, “”, “”]

James Edward G. II


#9

On Feb 1, 2006, at 1:26 AM, Yukihiro M. wrote:

If returns a enumerator object just like other enumerable methods do
if no block is given to them.

matz.

How deep does this rabbit hole go?

Does map return an enumerable without a block? And if so, can we type
obj.map.map.map… til the end of time?


#10

Hi,

On 2/1/06, Logan C. removed_email_address@domain.invalid wrote:

How deep does this rabbit hole go?

As deep as you want, and the machine allows

Does map return an enumerable without a block? And if so, can we type
obj.map.map.map… til the end of time?

Yes.

matz.


#11

Hi,

On 2/1/06, Jacob F. removed_email_address@domain.invalid wrote:

On 1/31/06, Yukihiro M. removed_email_address@domain.invalid wrote:

Using my not-yet-committed 1.9, you can type

42.times.collect{String::new}

to get the same result.

So does times still work with a block?

Yes.

I’m assuming that it switches
behavior, being a generator itself if a block is present, and creating
a generator object (which includes Enumerable) when no block is
provided.

If returns a enumerator object just like other enumerable methods do
if no block is given to them.

matz.


#12

“James Edward G. II” removed_email_address@domain.invalid wrote in message
news:removed_email_address@domain.invalid…

James Edward G. II

Thank for these!!

I was looking for a clean (Ruby) way of creating an array of ascending
integer values, with the final value zero. IE [ 1, 2, 3, 4, 0 ]
i = 0; a = Array.new( 4 ) { i += 1 }.push 0
does what I want.


#13

On 1/31/06, Yukihiro M. removed_email_address@domain.invalid wrote:

If returns a enumerator object just like other enumerable methods do
if no block is given to them.

Sweet! I’ve wanted this sort of enumerator generation for a while. Is
this new across the board in 1.9, or have I just been stupid in
assuming it didn’t work when it has this whole time?

Jacob F.


#14

“James Edward G. II” removed_email_address@domain.invalid wrote in message
news:removed_email_address@domain.invalid…

James Edward G. II

Thank for these!!

I was looking for a clean (Ruby) way of creating an array of ascending
integer values, with the final value zero. IE [ 1, 2, 3, 4, 0 ]
i = 0; a = Array.new( 4 ) { i += 1 }.push 0
does what I want.


#15

removed_email_address@domain.invalid wrote:

i threw this out before. thought i’d try again:

harp:~ > irb
irb(main):001:0> class Numeric; def of(&b) Array::new(self).map(&b) end; end
=> nil

irb(main):002:0> 42.of{ String::new }
=> ["", “”, “”, “”, “”, “”, “”, “”, “”, “”, . . .

class Fixnum
def of
(0…self).map{ yield }
end
end

p 3.of { “” }

===> ["", “”, “”]


#16

Phil D. removed_email_address@domain.invalid wrote:

I was looking for a clean (Ruby) way of creating an array of ascending
integer values, with the final value zero. IE [ 1, 2, 3, 4, 0 ]
i = 0; a = Array.new( 4 ) { i += 1 }.push 0
does what I want.

(1…4).to_a.push(0)

also Array.new passes in the index to the block, so you can do

Array.new(4) {|i| i+1}

martin


#17

The coming dawn of Role-Oriented Progamming is upon us (such is the way
of the Functor).


#18

Robert K. wrote:

=> [1, 2, 3, 4, 0]

a=(1…5).inject([]) {|ar,i| ar << (i%5)}
=> [1, 2, 3, 4, 0]

a=(1…5).inject([]) {|ar,i| ar << i} << 0
=> [1, 2, 3, 4, 5, 0]

Pardon me, the last one should’ve read:

a=(1…4).inject([]) {|ar,i| ar << i} << 0
=> [1, 2, 3, 4, 0]

robert

#19

Bah, too long!
[""] * 42
Sorry, just had to jump in :slight_smile:
.adam sanderson


#20

On 2/1/06, Phil D. removed_email_address@domain.invalid wrote:

I was looking for a clean (Ruby) way of creating an array of ascending
integer values, with the final value zero. IE [ 1, 2, 3, 4, 0 ]
i = 0; a = Array.new( 4 ) { i += 1 }.push 0

a = (1…4).to_a << 0

-Levin