=== operator

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-forum.com/\.

Hi --

···

On Thu, 7 Jun 2007, Jon Leighton wrote:

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?

Yes; === is called on the when expression(s), with the case object as
argument.

David

--
Q. What is THE Ruby book for Rails developers?
A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black\)
    (See what readers are saying! http://www.rubypal.com/r4rrevs.pdf\)
Q. Where can I get Ruby/Rails on-site training, consulting, coaching?
A. Ruby Power and Light, LLC (http://www.rubypal.com)

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

···

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

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

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 :frowning:

Robert

···

On 6/6/07, dblack@wobblini.net <dblack@wobblini.net> wrote:

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

···

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 :frowning:

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

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 :frowning:

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.

David

···

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:

--
Q. What is THE Ruby book for Rails developers?
A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black\)
    (See what readers are saying! http://www.rubypal.com/r4rrevs.pdf\)
Q. Where can I get Ruby/Rails on-site training, consulting, coaching?
A. Ruby Power and Light, LLC (http://www.rubypal.com)

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

···

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 :frowning:

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.