Forum: Ruby Numeric#of

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
unknown (Guest)
on 2006-02-01 01:06
(Received via mailing list)
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
Yukihiro M. (Guest)
on 2006-02-01 01:18
(Received via mailing list)
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.
Jacob F. (Guest)
on 2006-02-01 01:48
(Received via mailing list)
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.
Matthew M. (Guest)
on 2006-02-01 01:57
(Received via mailing list)
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 }
=> ["", "", ""]
Jacob F. (Guest)
on 2006-02-01 02:06
(Received via mailing list)
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? :) or Integer.

Jacob F.
unknown (Guest)
on 2006-02-01 03:01
(Received via mailing list)
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
James G. (Guest)
on 2006-02-01 03:28
(Received via mailing list)
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
unknown (Guest)
on 2006-02-01 04:01
(Received via mailing list)
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!  ;-)

-a
Yukihiro M. (Guest)
on 2006-02-01 08:27
(Received via mailing list)
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.
Logan C. (Guest)
on 2006-02-01 08:33
(Received via mailing list)
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?
Yukihiro M. (Guest)
on 2006-02-01 08:51
(Received via mailing list)
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.
Jacob F. (Guest)
on 2006-02-01 18:05
(Received via mailing list)
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.
Phil D. (Guest)
on 2006-02-02 01:02
(Received via mailing list)
"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.
Phil D. (Guest)
on 2006-02-02 01:02
(Received via mailing list)
"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.
William J. (Guest)
on 2006-02-02 01:11
(Received via mailing list)
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 { "" }

===>  ["", "", ""]
Trans (Guest)
on 2006-02-02 01:14
(Received via mailing list)
The coming dawn of Role-Oriented Progamming is upon us (such is the way
of the Functor).
Martin DeMello (Guest)
on 2006-02-02 01:29
(Received via mailing list)
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
Robert K. (Guest)
on 2006-02-02 01:29
(Received via mailing list)
Martin DeMello wrote:
> also Array.new passes in the index to the block, so you can do
>
> Array.new(4) {|i| i+1}

Here are some more alternatives including a solution with the famous
#inject. :-)

>> a=Array.new(5) {|i| (i+1)%5}
=> [1, 2, 3, 4, 0]
>> a=(1..4).to_a << 0
=> [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]

Have fun!

Kind regards

    robert
Robert K. (Guest)
on 2006-02-02 01:32
(Received via mailing list)
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
Adam S. (Guest)
on 2006-02-02 01:50
(Received via mailing list)
Bah, too long!
  [""] * 42
Sorry, just had to jump in :)
  .adam sanderson
Levin A. (Guest)
on 2006-02-02 02:33
(Received via mailing list)
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
Mauricio F. (Guest)
on 2006-02-02 02:36
(Received via mailing list)
On Thu, Feb 02, 2006 at 01:03:30AM +0900, Jacob F. wrote:
> 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?


It's been working for Enumerable (and similar) methods for a while (in
1.9):

Fri Jul 15 00:11:36 2005  Nobuyoshi N.  <removed_email_address@domain.invalid>

	* enum.c (enumeratorize): create new enumerator for current method if
	  no block is given.

	* enumerator.c: moved from ext/enumerator.



batsman@tux-chan:~/src/ruby/ruby.head$ grep -B 8 RETURN_ENUMERA -h *.c |
egrep '^\w+\('
rb_ary_index(int argc, VALUE *argv, VALUE ary)
rb_ary_rindex(int argc, VALUE *argv, VALUE ary)
rb_ary_each(VALUE ary)
rb_ary_each_index(VALUE ary)
rb_ary_reverse_each(VALUE ary)
rb_ary_collect(VALUE ary)
rb_ary_collect_bang(VALUE ary)
rb_ary_select(VALUE ary)
rb_ary_reject_bang(VALUE ary)
rb_ary_reject(VALUE ary)
dir_each(VALUE dir)
enum_find(int argc, VALUE *argv, VALUE obj)
enum_find_all(VALUE obj)
enum_reject(VALUE obj)
enum_collect(VALUE obj)
enum_partition(VALUE obj)
enum_sort_by(VALUE obj)
enum_min_by(VALUE obj)
enum_max_by(VALUE obj)
enum_each_with_index(VALUE obj)
rb_hash_select(VALUE hash)
rb_hash_each_value(VALUE hash)
rb_hash_each_key(VALUE hash)
rb_hash_each_pair(VALUE hash)
rb_hash_each(VALUE hash)
env_each_key(VALUE ehash)
env_each_value(VALUE ehash)
env_each(VALUE ehash)
env_each_pair(VALUE ehash)
env_select(VALUE ehash)
rb_io_each_line(int argc, VALUE *argv, VALUE io)
rb_io_each_byte(VALUE io)
rb_io_s_foreach(int argc, VALUE *argv, VALUE self)
argf_each_line(int argc, VALUE *argv, VALUE self)
argf_each_byte(VALUE self)
range_step(int argc, VALUE *argv, VALUE range)
range_each(VALUE range)
rb_str_each_byte(VALUE str)
rb_struct_each(VALUE s)
rb_struct_each_pair(VALUE s)
Florian GroÃ? (Guest)
on 2006-02-02 02:39
(Received via mailing list)
Phil D. 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

Two more ways of doing it:

Array.new(4) { |i| i + 1 } + [0]
(1 .. 4).to_a + [0]

Too bad [*1..4, 0] doesn't work.
Ross B. (Guest)
on 2006-02-02 03:40
(Received via mailing list)
On Thu, 2006-02-02 at 08:36 +0900, Florian GroÃ? wrote:

> Too bad [*1..4, 0] doesn't work.
>

Isn't it? The best I got was:

	[*1..4] << 0
	# => 1, 2, 3, 4, 0
Joel VanderWerf (Guest)
on 2006-02-02 08:15
(Received via mailing list)
Adam S. wrote:
> Bah, too long!
>   [""] * 42
> Sorry, just had to jump in :)
>   .adam sanderson
>

irb(main):018:0> a=[""]*42
=> ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", ""]
irb(main):019:0> a[0]<<"I will not reuse string objects in class."; puts
a
I will not reuse string objects in class.
I will not reuse string objects in class.
I will not reuse string objects in class.
I will not reuse string objects in class.
I will not reuse string objects in class.
I will not reuse string objects in class.
I will not reuse string objects in class.
.
.
.



;)
unknown (Guest)
on 2006-02-02 17:15
(Received via mailing list)
On Thu, 2 Feb 2006, Adam S. wrote:

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

this is __exactly__ why i made the RCR!

   harp:~ > ruby -e ' a = [""] * 2;  a.first << "42";  p a.last '
   "42"

;-)

-a
Jeremy H. (Guest)
on 2006-02-02 23:24
(Received via mailing list)
On 2006-02-01, Florian Groß <removed_email_address@domain.invalid> wrote:

> Too bad [*1..4, 0] doesn't work.

[[*1..4], 0].flatten does.

Cheers,

Jeremy H.
unknown (Guest)
on 2006-02-03 01:31
(Received via mailing list)
On Feb 1, 2006, at 6:36 PM, Florian Groß wrote:
> Too bad [*1..4, 0] doesn't work.

Is this another YACC parsing problem or is there
some other conceptual reason why this would be prohibited?


Gary W.
This topic is locked and can not be replied to.