Ruby class types and case statements
Solution 1:
You must use:
case item
when MyClass
...
I had the same problem: How to catch Errno::ECONNRESET class in "case when"?
Solution 2:
Yeah, Nakilon is correct, you must know how the threequal === operator works on the object given in the when
clause. In Ruby
case item
when MyClass
...
when Array
...
when String
...
is really
if MyClass === item
...
elsif Array === item
...
elsif String === item
...
Understand that case is calling a threequal method (MyClass.===(item)
for example), and that method can be defined to do whatever you want, and then you can use the case statement with precisionw
Solution 3:
You can use:
case item.class.to_s
when 'MyClass'
...when the following twist is not possible:
case item
when MyClass
The reason for this is that case
uses ===
, and the relationship the ===
operator describes is not commutative. For example, 5
is an Integer
, but is Integer
a 5
? This is how you should think of case
/when
.
Solution 4:
In Ruby, a class name is a constant that refers to an object of type Class
that describes a particular class. That means that saying MyClass
in Ruby is equivalent to saying MyClass.class
in Java.
obj.class
is an object of type Class
describing the class of obj
. If obj.class
is MyClass
, then obj
was created using MyClass.new
(roughly speaking). MyClass
is an object of type Class
that describes any object created using MyClass.new
.
MyClass.class
is the class of the MyClass
object (it's the class of the object of type Class
that describes any object created using MyClass.new
). In other words, MyClass.class == Class
.