[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

=== operator

Jon Leighton

6/6/2007 8:17:00 PM

Hi,

>> {} === Hash
=> false
>> case {}
>> when Hash then true
>> end
=> true
>> Hash === {}
=> true

Why is the first statement false when the second is true? I understand
case uses === to compare the objects? Perhaps it switches them round as
in the last statement?

Cheers,

Jon

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

6 Answers

dblack

6/6/2007 8:26:00 PM

0

Robert Dober

6/6/2007 8:31:00 PM

0

On 6/6/07, Jon Leighton <turnip@turnipspatch.com> wrote:
> Hi,

Maybe a more explicit notation helps
>
> >> {} === Hash
{}.send(:===, Hash)
> => false
> >> case {}
> >> when Hash then true
when Hash.send(:===, {}) then true
> >> end
> => true
> >> Hash === {}
> => true
>
> Why is the first statement false when the second is true? I understand
> case uses === to compare the objects? Perhaps it switches them round as
> in the last statement?
No the LHS is the receiver and the RHS is the first argument of the message.
{}.send(:===, Hash) the === instance_method of Hash is called which is
inherited from Object and basically means equality, hence false.

Hash.send(:===, {}) the class method of Hash is called which is
inherited from Class and means is_a? hence true.

HTH
Robert


--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw

Robert Dober

6/6/2007 8:33:00 PM

0

On 6/6/07, dblack@wobblini.net <dblack@wobblini.net> wrote:
> Hi --
<snip>
> Yes; === is called on the when expression(s), with the case object as
> argument.
Well you are right of course, I said now because I did not understand
what OP meant :(

Robert

Bertram Scharpf

6/7/2007 3:00:00 AM

0

Am Donnerstag, 07. Jun 2007, 05:32:38 +0900 schrieb Robert Dober:
> On 6/6/07, dblack@wobblini.net <dblack@wobblini.net> wrote:
> <snip>
> >Yes; === is called on the when expression(s), with the case object as
> >argument.
> Well you are right of course, I said now because I did not understand
> what OP meant :(

Some may say it's an unexpected behaviour. Others will find
themselves detecting it as a welcome surprise. This is Ruby
at its best.

Bertram


--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-...

dblack

6/7/2007 11:02:00 AM

0

Robert Klemme

6/7/2007 3:59:00 PM

0

On 07.06.2007 13:02, dblack@wobblini.net wrote:
> Hi --
>
> On Thu, 7 Jun 2007, Bertram Scharpf wrote:
>
>> Am Donnerstag, 07. Jun 2007, 05:32:38 +0900 schrieb Robert Dober:
>>> On 6/6/07, dblack@wobblini.net <dblack@wobblini.net> wrote:
>>> <snip>
>>>> Yes; === is called on the when expression(s), with the case object as
>>>> argument.
>>> Well you are right of course, I said now because I did not understand
>>> what OP meant :(
>>
>> Some may say it's an unexpected behaviour. Others will find
>> themselves detecting it as a welcome surprise. This is Ruby
>> at its best.
>
> I always thought it was just the logical way to do the case statement.
> Since you're testing something about the case object, you may not know
> what it is or what its === method does:
>
> case x # what is x?
> when 1 ...
> when "yes" ...
> when C
> when nil ...
> end
>
> So I don't think it would make sense to have a case construct where
> === was called on x.

Another reason why that would be an odd way to do it: *all* tests then
would have to be implemented in x's class - now how much sense would
that make to do that? Just think of the type test (i.e. using class
objects in when clause)...

Kind regards

robert