# Case question

**URL:** <https://www.ruby-forum.com/t/case-question/94874>\
**Category:** Ruby\
**Created:** [January 10, 2006, 12:59am UTC](https://www.ruby-forum.com/t/case-question/94874 "2006-01-10T00:59:24Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![SchSSS\_le\_Daniel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/a183cd/32.png) [@SchSSS\_le\_Daniel](https://www.ruby-forum.com/u/SchSSS_le_Daniel)\
**Post date:** [January 10, 2006, 12:59am UTC](https://www.ruby-forum.com/t/case-question/94874/1 "2006-01-10T00:59:24Z")

</div>

Hello,

I am a little confused

irb(main):165:0\* case nil.class  
irb(main):166:1\> when NilClass  
irb(main):167:1\> puts “hier”  
irb(main):168:1\> when Array  
irb(main):169:1\> puts “dort”  
irb(main):170:1\> else  
irb(main):171:1\* puts “aaa”  
irb(main):172:1\> end  
aaa  
=\> nil  
irb(main):173:0\> nil.class  
=\> NilClass  
irb(main):174:0\>

it must miss something  
Any ideas?

Regards, Daniel

---

<div class="post-metadata">

**Author:** ![SchSSS\_le\_Daniel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/a183cd/32.png) [@SchSSS\_le\_Daniel](https://www.ruby-forum.com/u/SchSSS_le_Daniel)\
**Post date:** [January 10, 2006, 1:08am UTC](https://www.ruby-forum.com/t/case-question/94874/2 "2006-01-10T01:08:27Z")

</div>

On 1/9/06, Schüle Daniel [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> irb(main):171:1\* puts “aaa”  
> irb(main):172:1\> end  
> aaa  
> =\> nil  
> irb(main):173:0\> nil.class  
> =\> NilClass

case statements use the === operator for comparison, with the when  
clause as receiver. So:

case arg  
when condition: do\_something  
end

is the same as:

if (condition === arg)  
do\_something  
end

In this case, invoking the === operator on a Class object (of which  
NilClass is an instance) checks to see if the argument is an instance  
of that class. NilClass is not an instance of NilClass, but of Class.  
So if you’d written:

case nil.class  
when NilClass: puts “hier”  
when Array: puts “dort”  
when Class: puts “xyz”  
else puts “aaa”  
end

You would have got “xyz” as the result. To do what you intended, just  
leave off the call to #class on nil:

case nil  
when NilClass: puts “hier”  
when Array: puts “dort”  
else puts “aaa”  
end

That should print “hier”, since nil is an instance of NilClass.

Jacob F.

---

<div class="post-metadata">

**Author:** ![SchSSS\_le\_Daniel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/a183cd/32.png) [@SchSSS\_le\_Daniel](https://www.ruby-forum.com/u/SchSSS_le_Daniel)\
**Post date:** [January 10, 2006, 1:20am UTC](https://www.ruby-forum.com/t/case-question/94874/3 "2006-01-10T01:20:32Z")

</div>

> it must miss something  
> Any ideas?

case comparisons are done using ===.

irb(main):017:0\> nil.class === NilClass  
=\> false  
irb(main):018:0\> nil.class == NilClass  
=\> true

For classes/modules, it’s used to determine if an instance is a  
descendant:

irb(main):027:0\> 5 === Fixnum  
=\> false  
irb(main):028:0\> Fixnum === 5  
=\> true

Caleb

---

<div class="post-metadata">

**Author:** ![SchSSS\_le\_Daniel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/a183cd/32.png) [@SchSSS\_le\_Daniel](https://www.ruby-forum.com/u/SchSSS_le_Daniel)\
**Post date:** [January 10, 2006, 2:17pm UTC](https://www.ruby-forum.com/t/case-question/94874/4 "2006-01-10T14:17:11Z")

</div>

> can I assume that === is in this context the same as kind\_of?  
> or are there subtle differences between them

=== by default calls == unless you specifically override it in your  
implementation.

Module overrides it (which means that Class overrides it as well).

I think it’s probably safe to say that === is in the same context as  
kind\_of?,  
at least for classes:

irb(main):009:0\> NilClass === nil  
=\> true  
irb(main):010:0\> nil === NilClass  
=\> false

Caleb

---

<div class="post-metadata">

**Author:** ![SchSSS\_le\_Daniel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/a183cd/32.png) [@SchSSS\_le\_Daniel](https://www.ruby-forum.com/u/SchSSS_le_Daniel)\
**Post date:** [January 10, 2006, 1:44am UTC](https://www.ruby-forum.com/t/case-question/94874/5 "2006-01-10T01:44:41Z")

</div>

Caleb T. wrote:

> irb(main):018:0\> nil.class == NilClass  
> =\> true
> 
> For classes/modules, it’s used to determine if an instance is a  
> descendant:

nil.kind\_of? NilClass

can I assume that === is in this context the same as kind\_of?  
or are there subtle differences between them

> irb(main):027:0\> 5 === Fixnum  
> =\> false  
> irb(main):028:0\> Fixnum === 5  
> =\> true
> 
> Caleb

thanks to both, this helps
