From: "Ara.T.Howard" Date: 2005-08-20T00:11:23+09:00 Subject: Re: Case Expressions and Classes On Fri, 19 Aug 2005, Daniel Schierbeck wrote: > Could anyone explain to me why this isn't working? > > # returns 'no' > case :foo.class > when Symbol then > puts 'yes' > else > puts 'no' > end > > .... when this does > > # returns 'yes' > case :foo.class.object_id > when Symbol.object_id then > puts 'yes' > else > puts 'no' > end > > I'm puzzled... > > > Thank you in advance, > Daniel Schierbeck case statements use the '===' operator. the '===' for classes is the same as 'is_a?' for classes. so writing with case statements the obj of the statement is used as the argument for the '===' operator of each case, so case obj when Foo ... when Bar end is the same as if Foo === obj ... elsif Bar === obj ... end and case string when %r/foo/ ... when %r/bar/ end is the same as if %r/foo/ === string ... elsif %/bar/ === string ... end so what you've written: case Symbol when Symbol 'yes' else 'no' end is the same as if Symbol === Symbol 'yes' else 'no' end so, '===', when applied to a class, tests if an object is an __instance__ of that class. so String === 'a string' #=> true Array === [42] #=> true therefore, you are asking if Symbol is an instance of a Symbol - which it is not. it __is__ equalivalent to Symbol, but that would mean '==' and not '==='. case statements can also do this case obj when String, Fixnum, Array when File when %r/foo/, %r/bar/ else end where each element in the list applies '===' to the argument 'obj' to see when line triggers - it's really powerful. hth. -a -- =============================================================================== | email :: ara [dot] t [dot] howard [at] noaa [dot] gov | phone :: 303.497.6469 | Your life dwells amoung the causes of death | Like a lamp standing in a strong breeze. --Nagarjuna ===============================================================================