2013-06-21 59 views
1

我正在使用一些複雜的class/mixin層次結構的系統。由於分散在許多不同文件上的許多圖層,我想快速查看給定方法的超級調用鏈。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", ...] 
+0

如果有人認爲一個更好的標題,讓我知道。 – ratelle

回答

1

也許這樣的事情?

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] 
0
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 
+0

你的代碼可以改進,所以爲什麼你沒有把它放在問題本身,要求人們在這裏爲你的代碼做出其他選擇或改進。 –

+0

因爲這是一個答案。沒有什麼能夠阻止人們發佈另一個或評論來提出改進建議。你爲什麼不建議改進? – ratelle

+0

@OMG我認爲如果有一個網站可以提交代碼,並讓現場人員對其進行評論並通過對其進行評論並告訴你他們如何以不同的方式處理問題,它甚至只是針對該特定語言的一種更加標準化的方法,因爲當我第一次開始學習ruby時,我正在嘗試爲for循環而不是.each循環。 –

相關問題