From: =?ISO-8859-1?Q?Une_B=E9vue?= on
I've found in case / when if the case is about a class :

case my_var.class
when String then puts my_var
when Array then my_var.each {|v| puts v}
end

doesn't work i do have to use :

case my_var.class.to_s
when 'String' then puts my_var
when 'Array' then my_var.each {|v| puts v}
end

why ?

(with ruby 1.9.x)
--
� Le verbe aimer est difficile � conjuguer :
son pass� n'est pas simple, son pr�sent n'est qu'indicatif,
et son futur est toujours conditionnel. �
(Jean Cocteau)
From: Rimantas Liubertas on
> I've found in case / when if the case is about a class :
>
> case my_var.class
> when String then puts my_var
> when Array  then my_var.each {|v| puts v}
> end
>
> doesn't work i do have to use :
>
> case my_var.class.to_s
> when 'String' then puts my_var
> when 'Array'  then my_var.each {|v| puts v}
> end
>
> why ?

"when" condition in case statement uses === to compare objects. For
strings a = b is true if a and b have the same characters, however
String === String is false:


>> a = "Hello"
=> "Hello"
>> b = "Hello"
=> "Hello"
>> a === b
=> true
>> String === String
=> false

BTW "===" is a method:

>> a.===(b)
=> true

so you can define your own rules when objects should be considered equal:

class Marble
attr_accessor :size, :color

def initialize(size, color)
self.size = size
self.color = color
end

def ===(other)
self.color == other.color
end

end

m1 = Marble.new(0.5, "red")
m2 = Marble.new(0.5, "green")
m3 = Marble.new(0.7, "red")

case m1
when m2
puts "Matching marble is m2"
when m3
puts "Matching marble is m3"
else
puts "No match"
end

The result is "Matching marble is m3"

Regards,
Rimantas

From: Rein Henrichs on
On 2010-06-10 23:41:05 -0700, Une B�vue said:

> I've found in case / when if the case is about a class :
>
> case my_var.class
> when String then puts my_var
> when Array then my_var.each {|v| puts v}
> end
>
> doesn't work i do have to use :
>
> case my_var.class.to_s
> when 'String' then puts my_var
> when 'Array' then my_var.each {|v| puts v}
> end
>
> why ?
>
> (with ruby 1.9.x)

Because of the behavior of the Module #== operator -- which you can
look it up at ruby-doc.org -- you can somply do this:

case my_var
when String then puts my_var
when Array ...
end
--
Rein Henrichs
http://puppetlabs.com
http://reinh.com

From: Jesús Gabriel y Galán on
2010/6/11 Une Bévue <unbewusst.sein(a)google.com.invalid>:
> I've found in case / when if the case is about a class :
>
> case my_var.class
> when String then puts my_var
> when Array  then my_var.each {|v| puts v}
> end
>
> doesn't work

case calls the method === on the when object passing the case object
as an argument. So the above is calling:

String.=== (my_var.class)

If you check this:

http://ruby-doc.org/core/classes/Module.html#M001666

it says it returns true if the object is *an instance* of this class.
So you don't have to pass the class, but the object itself:

case my_var
when String then puts my_var
when Array then my_var.each {|v| puts v}
end

irb(main):003:0> def test var
irb(main):004:1> case var
irb(main):005:2> when String then puts var
irb(main):006:2> when Array then var.each {|v| puts v}
irb(main):007:2> end
irb(main):008:1> end
=> nil
irb(main):009:0> test "hello"
hello
=> nil
irb(main):010:0> test [1,2,3]
1
2
3
=> [1, 2, 3]



> i do have to use :
>
> case my_var.class.to_s
> when 'String' then puts my_var
> when 'Array'  then my_var.each {|v| puts v}
> end

You can also do this, but the above is cleaner.

Jesus.

From: Rimantas Liubertas on
> For strings a = b is true if a and b have the same characters

err, I ment a === b . For strings a === b is the same as a == b.
That's mostly true for other objects too (if they don't override ===
),
but not always.


Regards,
Rimantas