Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Enumerable

Reply
Thread Tools

Enumerable

 
 
Michael Saltzman
Guest
Posts: n/a
 
      08-01-2006
Am new to Ruby and have the folloiwng Question.

I have a class, say Collect, and I want to mixin Enumerable. How do I
write the each method in Collect?

class Collect
include Enumerable
def initialize()
@array = Array.new(0)
@ct = 0
end
def add(item)
@array.push(item)
@ct += 1
end
def howmany
@ct
end
def each
#
# Not sure how to do this????
#
end
end

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

 
Reply With Quote
 
 
 
 
Martin DeMello
Guest
Posts: n/a
 
      08-01-2006
On 8/1/06, Michael Saltzman <(E-Mail Removed)> wrote:
> Am new to Ruby and have the folloiwng Question.
>
> I have a class, say Collect, and I want to mixin Enumerable. How do I
> write the each method in Collect?
>
> class Collect
> include Enumerable
> def initialize()
> @array = Array.new(0)
> @ct = 0
> end
> def add(item)
> @array.push(item)
> @ct += 1
> end
> def howmany
> @ct
> end
> def each
> #
> # Not sure how to do this????
> #
> end
> end


Assuming you want to iterate over @array,

def each
@array.each {|i| yield i}
end

martin

 
Reply With Quote
 
 
 
 
A. S. Bradbury
Guest
Posts: n/a
 
      08-01-2006
On Tuesday 01 August 2006 16:43, Michael Saltzman wrote:
> Am new to Ruby and have the folloiwng Question.
>
> I have a class, say Collect, and I want to mixin Enumerable. How do I
> write the each method in Collect?
>
> class Collect
> include Enumerable
> def initialize()
> @array = Array.new(0)
> @ct = 0
> end
> def add(item)
> @array.push(item)
> @ct += 1
> end
> def howmany
> @ct
> end
> def each
> #
> # Not sure how to do this????
> #
> end
> end

It depends what you want each to do? Just to wrap @array.each? In that case,
this would work:
def each
@array.each {|item| yield item}
end

Of course you can do whatever you want to the array item in the block before
you yield it again.

An alternative technique is as follows:
def each(&block)
@array.each(&block)
end

I'm sure someone will correct me if I describe this slightly wonky, but the
basic idea is that the interpreter converts the block argument to a proc with
a name (I think I read an article that claimed a block is always converted to
a proc, but when no &arg is given, it is simply a proc with no name,
accessible of course via yield). This is then passed on to @array.each as a
block argument.

I don't know whether there are any real advantages or disadvantages to either
method. Hope this helps

Alex

 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      08-01-2006
Michael Saltzman wrote:
> Am new to Ruby and have the folloiwng Question.
>
> I have a class, say Collect, and I want to mixin Enumerable. How do I
> write the each method in Collect?
>
> class Collect
> include Enumerable
> def initialize()
> @array = Array.new(0)
> @ct = 0
> end
> def add(item)
> @array.push(item)
> @ct += 1
> end
> def howmany
> @ct
> end
> def each
> #
> # Not sure how to do this????
> #
> end
> end
>


You have several options:

class Collect
include Enumerable

def initialize()
@array = []
end

def add(item)
@array.push(item)
self
end

alias :<< :add

def howmany
@array.size
end

# option 1: use yield
def each_1
@array.each {|x| yield x}
self
end

# option 2: delegate to Array's each
def each_2(&b)
@array.each(&b)
self
end
end

Kind regards

robert
 
Reply With Quote
 
A. S. Bradbury
Guest
Posts: n/a
 
      08-01-2006
On Tuesday 01 August 2006 17:06, A. S. Bradbury wrote:
> It depends what you want each to do? Just to wrap @array.each? In that
> case, this would work:
> def each
> @array.each {|item| yield item}
> end
>
> Of course you can do whatever you want to the array item in the block
> before you yield it again.
>
> An alternative technique is as follows:
> def each(&block)
> @array.each(&block)
> end
>

<snip>
> I don't know whether there are any real advantages or disadvantages to
> either method. Hope this helps


Just did a quick benchmark out of curiosity:
user system total real
Two yields 15.720000 2.220000 17.940000 ( 20.336562)
Pass the named block 4.130000 1.020000 5.150000 ( 5.562950)
Direct on attr_accessor 3.810000 1.010000 4.820000 ( 5.440259)

I passed the block {|i| i} and initialized @array to (1..100).to_a, and ran
through 50000 times.

Alex

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Enumerable methods returning Enumerable (was: ruby-dev suumary 26862-26956) Daniel Sheppard Ruby 0 09-16-2005 02:40 AM
An addition to Array (or Enumerable)? Harry Ohlsen Ruby 11 12-29-2003 02:05 PM
Support for arbitrary iterators in Enumerable? Pierre-Charles David Ruby 2 11-20-2003 02:34 PM
Enumerable#inject is surprising me... Nathaniel Talbott Ruby 0 10-06-2003 11:29 PM
Why isn't Enumerable in StringIO? Jason Creighton Ruby 1 07-26-2003 05:14 AM



Advertisments