我正在學習一些元編程,並且我試圖找到一種方法。比方說,我有下面的類:在頂層定義的方法在哪裏存在?
class MyClass
def self.my_method
end
def your_method
end
end
用下面的代碼我可以搜索的對象空間的每個方法:
type = Class
name = /^my_method$/
result = ObjectSpace.each_object(type).select do |o|
o.instance_methods(false).grep(name).size > 0 || o.methods.grep(name).size > 0
end
p result
而且它發現它顯示下面的輸出:
[MyClass]
由於搜索程序代碼還搜索實例方法,它在查找your_method時顯示相同的輸出。
即使有,如果我加一個單方法的對象:
mc = MyClass.new
def mc.our_method
end
只是改變了搜索這樣的:
type = Object
name = /^our_method$/
result = ObjectSpace.each_object(type).select do |o|
o.methods.grep(name).size > 0
end
p result
它還發現它:
[#<MyClass:0x8f86760>]
的問題是,我如何找到頂層對象中定義的方法?此方法:
def hidden
end
此外,當定義類似這樣的方法時,哪個類是當前類?
注意,以饗讀者(我敢肯定安德魯知道這一點):可以改爲使用'puts Object.send:private_instance_methods,false#=> foo'。一個類似的語句(用'false')表示在'Object'中沒有創建新的實例方法。 – 2014-12-02 06:41:29