Implementing each and <=>

R

Ruby Rabbit

I have a data model and would like to let it be Enumerable. I want to
confirm if this is the way of implementing each and <=> :

def each
@list.each { |item| yield item }
end

def <=>(other)
@list <=> other
end

(let's just assume that @list is an array)

Thanks.
 
B

badboy

Ruby said:
I have a data model and would like to let it be Enumerable. I want to
confirm if this is the way of implementing each and <=> :

def each
@list.each { |item| yield item }
end

def <=>(other)
@list <=> other
end

(let's just assume that @list is an array)

Thanks.
i would define each like this:
def each(&blk)
@list.each(&blk)
end
 
R

Ruby Rabbit

badboy said:
i would define each like this:
def each(&blk)
@list.each(&blk)
end

okay, i forgot to mention that I was wondering whether the
easiest/cleanest way was to use a send somehow?

def each
@list.send
end

Actually, since the ruby source is in 'C' one can't check it to see
examples. I searched a lot but came up with nothing.

Thanks.
 
B

badboy

Ruby said:
okay, i forgot to mention that I was wondering whether the
easiest/cleanest way was to use a send somehow?

def each
@list.send
end

Actually, since the ruby source is in 'C' one can't check it to see
examples. I searched a lot but came up with nothing.

Thanks.
I don't think that using send is easier/cleaner
using @list.each(&blk) is nothing else than sending the message "each"
to @list with blk as a block parameter
 
D

Dave Thomas

I have a data model and would like to let it be Enumerable. I want to
confirm if this is the way of implementing each and <=> :

def <=>(other)
@list <=> other
end

<=> would normally apply to items in your list, not to the container
itself.
 
R

Ruby Rabbit

Dave said:
<=> would normally apply to items in your list, not to the container
itself.

That's whats confusing me. How would i put it?

I am putting in the <=> so this class might be more useful to others. I
haven't got around to using it myself. (I have a base class
ListDataModel with minimal methods and wanted to make it as useful as
possible).
 
K

Ken Bloom

okay, i forgot to mention that I was wondering whether the
easiest/cleanest way was to use a send somehow?

def each
@list.send
end

No. This won't work. Send is just a method for calling methods, and
unless you pass it a method name and all relevant arguments, it won't
know what message to send.

Thus, you'll be at

def each &blk
@list.send :each, &blk
end

and it's easier to do

def each &blk
@list.each &blk
end

--Ken
 
K

Ken Bloom

I am putting in the <=> so this class might be more useful to others. I
haven't got around to using it myself. (I have a base class
ListDataModel with minimal methods and wanted to make it as useful as
possible).

Is there sume useful comparison for comparing two different data models
with each other? If not, then don't define <=>.

--Ken
 
R

Ruby Rabbit

Thus, you'll be at

def each &blk
@list.send :each, &blk
end

and it's easier to do

def each &blk
@list.each &blk
end

--Ken

thanks, (I did forget to put the :each in the lines i put)
Is there sume useful comparison for comparing two different data models
with each other? If not, then don't define <=>.

No, not at all. Thanks again.
 
B

Brian Candler

Ruby said:
def <=>(other)
@list <=> other
end

Perhaps you mean something like this:

include Comparable
def <=>(other)
@list <=> other.list # or some other way to order them
end

Making your objects Comparable is distinct from making them Enumerable.
 
R

Ruby Rabbit

Brian said:
Perhaps you mean something like this:

include Comparable
def <=>(other)
@list <=> other.list # or some other way to order them
end

Making your objects Comparable is distinct from making them Enumerable.
I was thinking that including Comparable would give users the ability to
sort the existing model in various ways.

I was wrong there, since it clearly is a comparison with another model.
That is not something likely. My bad. Thanks, Brian.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,054
Latest member
LucyCarper

Latest Threads

Top