簡體   English   中英

紅寶石中某個類方法的已定義超級方法列表

[英]List of defined super methods for a certain class method in ruby

我正在使用具有一些復雜的類/混合層次結構的系統。 由於散布在許多不同文件上的層數眾多,因此我想快速了解給定方法的超級調用鏈。

例如

module AAA
  def to_s
    "AAA " + super()
  end
end

module BBB
  def to_s
    "BBB " + super()
  end
end

class MyArray < Array
  include AAA
  include BBB

  def to_s
    "MyArray " + super()
  end
end

> MyArray.new.to_s
=> "MyArray BBB AAA []"
> method_supers(MyArray,:to_s)
=> ["MyArray#to_s", "BBB#to_s", "AAA#to_s", "Array#to_s", ...]

也許像這樣?

class A
  def foo; p :A; end
end

module B
  def foo; p :B; super; end
end

module C; end

class D < A
  include B, C
  def foo; p :D; super; end
end

p D.ancestors.keep_if { |c| c.instance_methods.include? :foo }  # [D, B, A]

如果看起來正確,則可以相應地修改此功能:

def Object.super_methods(method)
  ancestors.keep_if { |c| c.instance_methods.include? method }
end

p D.super_methods(:foo)  # [D, B, A]
def method_supers(child_class,method_name)
  ancestry = child_class.ancestors

  methods = ancestry.map do |ancestor|
    begin
      ancestor.instance_method(method_name)
    rescue
      nil
    end
  end

  methods.reject!(&:nil?)

  methods.map {|m| m.owner.name + "#" + m.name.to_s}
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM