Actual class name

I’m trying to debug a problem I have with YAML. When I do:

puts “#{foo.class}”

I get (for example) Xyz

but I know that foo is not really of class Xyz. I think it is an
YAML::Object. The reason this happens is because to_s has been
overridden.

How can I get the real name of the class of an object?

I think this is what YAML::Object is doing:

#! /usr/bin/env ruby

class Xyz
def self.to_s
“dog”
end
end

x = Xyz.new
puts “#{x.class}”

I get “dog” instead of Xyz. How can I get Xyz in this case?

On Jan 5, 2011, at 08:23 , Perry S. wrote:

I’m trying to debug a problem I have with YAML. When I do:

Why not tell us about the real problem and not the symptom?

puts “#{foo.class}”

I get (for example) Xyz

but I know that foo is not really of class Xyz. I think it is an
YAML::Object. The reason this happens is because to_s has been
overridden.

Are you sure?

end

x = Xyz.new
puts “#{x.class}”

I get “dog” instead of Xyz. How can I get Xyz in this case?

You can try x.class.name instead… Or you can try to restore the real
name with:

x.class.send :remove_method, :to_s

Thanks.

The commented out line works – I get back an AsyncRequest instance that
is able to call perform. The ar = job.ybody does not work. I get back
a YAML::Object. (The debug line is hit)

ar = YAML.load(job.body) # The transmitted AsyncRequest

ar = job.ybody    # The transmitted AsyncRequest
if ar.kind_of? YAML::Object
  Rails.logger.debug("YAML::Object")
end
Rails.logger.debug("self.perform ar.class = #{ar.class.to_s}")
ar.perform

I’m interfacing with beanstalk-client and ybody is defined as:

def ybody()
(@ybody ||= [begin YAML.load(body) rescue nil end])[0]
end

I’m trying to figure out why my call to load works but the call inside
the gem is not working.