你似乎理解错case的用法了。case使用的是===做判断,而非==。要理解清楚这个问题,你首先需要知道“===”只是个“方法”。对于不同的类,它们对===有了不同的定义,也就会有不同的行为。对于普通对象(Object)来说 === 就是 == (请参见http://ruby-doc.org/core-1.9.3/Object.html )而对于Module,这个操作符被重载了。它的行为有点不一样。我还是来具体说一下吧。obj === other → true or false obj === other 返回true或者false 1  === Fixnum 
#=>false  1是Object而非Module, ===等同于==,而1显然不是Fixnum 
Fixnum  === 1 
#=> true Fixnum是Class也是Module,1是Fixnum的实例,也就是Fixnum的后裔。 
RPG::Weapon  === RPG::Weapon 
#=> false RPG::Weapon 不是 RPG::Weapon的实例及后裔! 
1  === Fixnum 
#=>false  1是Object而非Module, ===等同于==,而1显然不是Fixnum 
Fixnum  === 1 
#=> true Fixnum是Class也是Module,1是Fixnum的实例,也就是Fixnum的后裔。 
RPG::Weapon  === RPG::Weapon 
#=> false RPG::Weapon 不是 RPG::Weapon的实例及后裔! 
Class  === Class 
#=> true 
#等效于Class.kind_of? Class 
 
Class .ancestors 
#=> [Class, Module, Object, Kernel, BasicObject] 
#我们看下Class的继承关系,也就是它的祖先 
 
Object  == Class 
#=>true 
#等效于Class.kind_of? Object 
# 因为我们观察到Object是Class的祖先,所以这个是成立的 
# 
Class  === Class 
#=> true 
#等效于Class.kind_of? Class 
 
Class .ancestors 
#=> [Class, Module, Object, Kernel, BasicObject] 
#我们看下Class的继承关系,也就是它的祖先 
 
Object  == Class 
#=>true 
#等效于Class.kind_of? Object 
# 因为我们观察到Object是Class的祖先,所以这个是成立的 
#