我们如何覆盖对象的类名。

时间:2011-08-11 17:29:24

标签: ruby

我们如何覆盖对象的类名?

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

3 个答案:

答案 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