2017-10-13 71 views
1

在ruby中,是否可以獲取模塊中定義的所有優化列表?如何獲取在模塊中定義的所有優化?

例如,給定這樣的:[:foo, :trim]

module MyRefinements 
    refine String do 
    def foo 
     "#{self}_foo" 
    end 
    def trim 
     "this is not a good example, but demonstrates an override" 
    end 
    end 
end 

我怎樣才能得到一個這樣的數組?

+0

你想從一個模塊文件分析器或代碼本身中得到它? – mabe02

+0

@ mabe02,我寧願能夠從代碼本身獲得它。 –

回答

2

更新

有點難看,但工作。你應該知道模塊的名稱和類瑞風:

module MyRefinements 
    refine String do 
    def foo 
     "#{self}_foo" 
    end 
    def to_str 
     "this is not a good example, but demonstrates an override" 
    end 
    end 
end 

# Provide module name and class (type) 
def get_refinements mod, type 
    ret = [] 
    mod.module_eval do 
    refine type do 
     ret = self.ancestors 
     .select{|el| el.to_s.include? "refinement" } 
     .map{|el| el.instance_methods(false)}.flatten 
    end 
    end 
    ret 
end 

module Test 
    p get_refinements(MyRefinements, String) 
end 

輸出是:

#=> [:to_str, :foo] 
+0

我試圖玩弄你的想法。實際上,即使你正在提煉更多類型,它似乎也是一致的。你會考慮提供一個很好的選項來提供一個像'REFINED_METHODS = {}'這樣的散列,你可以將該類型設置爲鍵,並將這些方法細化爲可以作爲MyRefinements :: REFINED_METHODS訪問的值(你打印的只是_flatten_) ? – mabe02

+0

是否可以從精煉塊外部獲得此信息? –

+1

非常好!我相信你可以簡化一下:'refined_methods = []; MyRefinements.module_eval確實;細化字符串做; refined_methods = instance_methods(false);結束;結束; refined_methods#=> [:to_str,:foo]'。如果你添加'puts'self =#{self},ancestors =#{ancestors}''它會打印'self =#''和'ancestors = [#,String,Comparable,Object,Kernel,BasicObject]'。 –

相關問題