2015-09-01 20 views
0

一些模塊添加方法上我的課產生,可能是通過元編程:如何尋找到方法的定義時,它的通過define_method

class MyClass 
    include SomeMetaProgrammedModule 
    include SomeMetaProgrammedModule1 
    include SomeMetaProgrammedModule2 
    include SomeMetaProgrammedModule3 
end 

我想找到其中定義了一個名爲mysterious方法。我不能只用grep def mysteriousalias :mysterious,因爲mysterious使用

def self.included(klass) 
    klass.send(:define_method,"#{maybe_some_interpolation.gsub(...)}" 
    end 

我如何找到它的定義界定?我如何追蹤其來源?

+0

歡迎來到Stack Overflow。創建標題時請不要粘貼標籤。寫一個簡單的句子來描述問題。 –

+0

你的意思是'def self.included(klass)'?右括號缺失。該方法的主體沒有阻止?這將在我所假設的其中一個模塊中。 –

+0

當您在發表評論或回答後進行實質性修改時,最好清楚地表明它們已被修改(例如,**編輯:** ....)。否則,你可以渲染評論或答案令人困惑,甚至是非感性的。 –

回答

1

您可以使用UnboundMethod類來檢查方法的定義。

.instance_method呼叫類別初始化一個新的UnboundMethod實例。

要查找mysterious定義,你可以使用:

MyClass.instance_method(:mysterious).source_location 

返回:

["/Users/filip/crazy_project/SomeMetaProgrammingModule.rb", 21] 

,其中 「21」 是該行

+0

這是我的讚揚。這是我認爲你想要的最好的答案。 –

1

如果我沒有理解問題的數正確地,您可以使用Module#instance_methodMethod#owner

module Cat 
    def self.included(klass) 
    klass.send(:define_method, :kitten) do 
     puts "mew" 
    end 
    end 
    def cat 
    puts "meow" 
    end 
end 
module Dog 
    define_method(:dog) { puts "woof" } 
end 
Dog.send(:define_method, :pup) { puts "wuf" } 

class C 
    include Cat 
    include Dog 
end 

Cat.instance_methods        #=> [:cat] 
Dog.instance_methods        #=> [:dog, :pup] 
C.instance_methods(false)      #=> [:kitten] 
C.instance_methods & [:cat, :dog, :pup, :kitten] #=> [:kitten, :dog, :pup, :cat] 

c = C.new 
c.cat         # "meow" 
c.kitten        # "mew" 
c.dog         # "woof" 
c.pup         # "wuf" 

C.instance_method(:cat).owner   #=> Cat 
C.instance_method(:kitten).owner  #=> C 
C.instance_method(:dog).owner   #=> Dog 
C.instance_method(:pup).owner   #=> Dog 

編輯:我可能誤解了「它在哪裏定義」的含義。使用Filip的答案,我獲得:

C.instance_method(:kitten).source_location 
    #=> ["t.rb", 3] 
+0

我的問題不清楚,更新它 –

相關問題