From: =?ISO-8859-1?Q?Une_B=E9vue?= on 11 Jun 2010 02:41 I've found in case / when if the case is about a class : case my_var.class when String then puts my_var when Array then my_var.each {|v| puts v} end doesn't work i do have to use : case my_var.class.to_s when 'String' then puts my_var when 'Array' then my_var.each {|v| puts v} end why ? (with ruby 1.9.x) -- � Le verbe aimer est difficile � conjuguer : son pass� n'est pas simple, son pr�sent n'est qu'indicatif, et son futur est toujours conditionnel. � (Jean Cocteau)
From: Rimantas Liubertas on 11 Jun 2010 03:28 > I've found in case / when if the case is about a class : > > case my_var.class > when String then puts my_var > when Array  then my_var.each {|v| puts v} > end > > doesn't work i do have to use : > > case my_var.class.to_s > when 'String' then puts my_var > when 'Array'  then my_var.each {|v| puts v} > end > > why ? "when" condition in case statement uses === to compare objects. For strings a = b is true if a and b have the same characters, however String === String is false: >> a = "Hello" => "Hello" >> b = "Hello" => "Hello" >> a === b => true >> String === String => false BTW "===" is a method: >> a.===(b) => true so you can define your own rules when objects should be considered equal: class Marble attr_accessor :size, :color def initialize(size, color) self.size = size self.color = color end def ===(other) self.color == other.color end end m1 = Marble.new(0.5, "red") m2 = Marble.new(0.5, "green") m3 = Marble.new(0.7, "red") case m1 when m2 puts "Matching marble is m2" when m3 puts "Matching marble is m3" else puts "No match" end The result is "Matching marble is m3" Regards, Rimantas
From: Rein Henrichs on 11 Jun 2010 03:29 On 2010-06-10 23:41:05 -0700, Une B�vue said: > I've found in case / when if the case is about a class : > > case my_var.class > when String then puts my_var > when Array then my_var.each {|v| puts v} > end > > doesn't work i do have to use : > > case my_var.class.to_s > when 'String' then puts my_var > when 'Array' then my_var.each {|v| puts v} > end > > why ? > > (with ruby 1.9.x) Because of the behavior of the Module #== operator -- which you can look it up at ruby-doc.org -- you can somply do this: case my_var when String then puts my_var when Array ... end -- Rein Henrichs http://puppetlabs.com http://reinh.com
From: Jesús Gabriel y Galán on 11 Jun 2010 03:28 2010/6/11 Une Bévue <unbewusst.sein(a)google.com.invalid>: > I've found in case / when if the case is about a class : > > case my_var.class > when String then puts my_var > when Array then my_var.each {|v| puts v} > end > > doesn't work case calls the method === on the when object passing the case object as an argument. So the above is calling: String.=== (my_var.class) If you check this: http://ruby-doc.org/core/classes/Module.html#M001666 it says it returns true if the object is *an instance* of this class. So you don't have to pass the class, but the object itself: case my_var when String then puts my_var when Array then my_var.each {|v| puts v} end irb(main):003:0> def test var irb(main):004:1> case var irb(main):005:2> when String then puts var irb(main):006:2> when Array then var.each {|v| puts v} irb(main):007:2> end irb(main):008:1> end => nil irb(main):009:0> test "hello" hello => nil irb(main):010:0> test [1,2,3] 1 2 3 => [1, 2, 3] > i do have to use : > > case my_var.class.to_s > when 'String' then puts my_var > when 'Array' then my_var.each {|v| puts v} > end You can also do this, but the above is cleaner. Jesus.
From: Rimantas Liubertas on 11 Jun 2010 03:34
> For strings a = b is true if a and b have the same characters err, I ment a === b . For strings a === b is the same as a == b. That's mostly true for other objects too (if they don't override === ), but not always. Regards, Rimantas |