首页 > 解决方案 > 如果类方法被覆盖,则访问类

问题描述

这是一个外部类,其class方法被覆盖。

class Foo
  def class
    "fooo"
  end
end

class Boo < Foo
end

class Moo < Foo
end

现在我有一个子类的实例。是否可以找出它属于哪个类?

foo.class # currently returns 'fooo', I want get Boo or Moo.

标签: ruby

解决方案


您可以使用从安全的地方(例如)instance_method获取方法作为,将该未绑定的方法绑定到您的实例,然后调用它。例如:classObjectUnboundMethod

class_method = Object.instance_method(:class)
# #<UnboundMethod: Object(Kernel)#class> 

class_method.bind(Boo.new).call
# Boo 

class_method.bind(Moo.new).call
# Moo 

class_method.bind(Foo.new).call
# Foo 

当然,如果你也替换了Object#class(或Kernel#class),那么所有的赌注都没有了,你将进入一个充满痛苦和困惑的全新世界。


推荐阅读