【问题标题】:How do I see where in the Class Hierarchy a Method was defined and Overridden in Ruby?如何查看类层次结构中方法在 Ruby 中的定义和覆盖位置?
【发布时间】:2010-08-15 16:26:07
【问题描述】:

有没有办法知道方法是否被子类以编程方式覆盖?像这样工作的东西:

class BaseModel
  def create
    puts "superclass"
  end
end

class SomeModel < BaseModel
  def create
    puts "subclass"
  end
end

puts SomeModel.overridden_instance_methods #=> [:create]

有什么想法吗?

【问题讨论】:

    标签: ruby metaprogramming abstract-syntax-tree


    【解决方案1】:
    SomeModel.instance_methods(false) & BaseModel.instance_methods
    

    false 使instance_methods 不包含继承的方法。然后我们使用集合交集来查找之前在 BaseModel(或 Object)上定义的 SomeModel 上定义的所有方法。

    【讨论】:

    • BTW:如果你事先不知道SomeModel的直接超类,你可以用SomeModel.superclass代替BaseModel。这样,您可以将此功能打包为可重用的方法。类似class Class; def overriden_methods; instance_methods(false) &amp; superclass.instance_methods end end 然后:SomeModel.overriden_methods
    • 请注意,这不会捕获 SomeModel 混入定义 create() 的模块的情况。此表达式只会为您提供 SomeModel 直接覆盖的方法。
    猜你喜欢
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多