From: LAMBEAU Bernard Date: 2009-04-08T00:21:15+09:00 Subject: Re: barenames and case statements 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 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| >    case klass >    when String >        puts "String!" >    when Array >        puts "Array!" >    when Hash >        puts "Hash!" >    else >        puts "I don't know: #{klass}" >    end > 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| >    case klass.to_s >    when "String" >        puts "String!" >    when "Array" >        puts "Array!" >    when "Hash" >        puts "Hash!" >    else >        puts "I don't know: #{klass}" >    end > 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 > >