Because the === operator of the Class class (used in case statements)
checks for 'is an instance of'.

So, the following:

>    case klass
>    when String
>        puts "String!"
>    end

is to be interpreted as String===klass, that is to,
klass.is_a?(String), which is false. But the following is true:

case klass
when Class
  puts 'It's a class of course'
end

Hope it helps
blambeau

On Tue, Apr 7, 2009 at 5:10 PM, Eric Will <rakaur / malkier.net> wrote:
> I've encountered this in the past and thought I was messing something
> up, but it's happening still.
>
> Can anyone tell me why this:
>
> puts "ruby-#{RUBY_VERSION} [#{RUBY_PLATFORM}]"
>
> [String, Array, Hash].each do |klass|
>  ¨Âáóëìáó>  ¨ÂèåÓôòéîç
>  ¨Âõô¢Óôòéîç¡>  ¨ÂèåÁòòá>  ¨Âõô¢Áòòáù¡¢
>  ¨ÂèåÈáóè
>  ¨Âõô¢Èáóè¡>  ¨Âìó>  ¨Âõô¢É äïî§ëîï÷£ûëìáóóý>  ¨Âîä
> end
>
> Produces this:
>
> ruby-1.8.7 [x86_64-linux]
> I don't know: String
> I don't know: Array
> I don't know: Hash
>
> ruby-1.9.1 [x86_64-linux]
> I don't know: String
> I don't know: Array
> I don't know: Hash
>
> Am I missing something here? In order to get the expected result I
> have to do this:
>
> [String, Array, Hash].each do |klass|
>  ¨Âáóëìáóó®ôïßó
>  ¨Âèå¢Óôòéîç¢
>  ¨Âõô¢Óôòéîç¡>  ¨Âèå¢Áòòáù>  ¨Âõô¢Áòòáù¡¢
>  ¨Âèå¢Èáóè¢
>  ¨Âõô¢Èáóè¡>  ¨Âìó>  ¨Âõô¢É äïî§ëîï÷£ûëìáóóý>  ¨Âîä
> end
>
> This works of course, but why doesn't the former? I find it hard to
> believe this has been overlooked. What am I missing?
>
> -- Eric Will
>
>