我们如何覆盖对象的类名?
Example:
$ irb
irb(main):001:0> class Man
irb(main):002:1> end
=> nil
irb(main):003:0> obj = Man.new
=> #<Man:0xb7756464>
irb(main):004:0> puts obj.class
Man
=> nil
我想要一些像这样的东西
puts obj.class
Van instead of Man
=> nil
答案 0 :(得分:1)
class A; end
B = A.clone
o = B.new
p o.class
=> B
答案 1 :(得分:0)
记住,class
方法不返回类名(字符串),但实际上是一个常量类对象。您需要先创建一个类Van
,然后覆盖obj.class
方法,以便它返回Van
而不是Man
irb(main):001:0> class Man
irb(main):002:1> end
=> nil
irb(main):003:0> class Van
irb(main):004:1> end
=> nil
irb(main):005:0> obj = Man.new
=> #<Man:0x25043b8>
irb(main):006:0> def obj.class
irb(main):007:1> Van
irb(main):008:1> end
=> nil
irb(main):009:0> obj.class
=> Van
is_a?
和其他方法也可能需要重写
irb(main):010:0> obj.is_a? Man
=> true
irb(main):011:0> obj.is_a? Van
=> false
答案 2 :(得分:0)
我知道如何覆盖明显的类名:
class Man
def self.inspect
"Van"
end
end
irb(main):007:0* m = Man.new
=> #<Man:0x144ace0>
irb(main):008:0> m.class
=> Van
(ActiveRecord做类似的事情)
但做一个令人信服的伪造对象检查是棘手的。我不知道如何在0xb7756464
中执行#<Man:0xb7756464>
位,因此我不知道如何重新实现Man#inspect
。