2015-11-19 41 views
5

我能找到的最接近的是In Ruby, how do I check if method "foo=()" is defined?,但只有當方法是公開的時候,即使在類塊內部時,它也是可用的。如何檢查私有方法是否在ruby中定義

我想要什麼:

class Foo 
    private 

    def bar 
    "bar" 
    end 

    magic_private_method_defined_test_method :bar #=> true 
end 

我已經試過:

class Foo 
    private 

    def bar 
    "bar" 
    end 

    respond_to? :bar #=> false 
    #this actually calls respond_to on the class, and so respond_to :superclass gives true 
    defined? :bar #=> nil 
    instance_methods.include?(:bar) #=> false 
    methods.include?(:bar) #=> false 
    method_defined?(:bar) #=> false 
    def bar 
    "redefined!" 
    end # redefining doesn't cause an error or anything 

    public 
    def bar 
    "redefined publicly!" 
    end #causes no error, behaves no differently whether or not #bar had been defined previously 
end 
+0

附註:我*實際上*想知道這一點,並在編寫問題的過程中發現了答案。因爲我無法輕鬆找到我的答案,因此我希望下一個傢伙能夠做到。 – Shelvacu

回答

7

你想Module# private_method_defined?

class Foo 
    def do_stuff_if_bar_is_defined 
    if self.class.private_method_defined?(:bar) 
     do_stuff 
    end 
    end 

    private 

    def bar 
    "bar" 
    end 

    private_method_defined? :bar #=> true 
end 
Foo.private_method_defined? :bar #=> true 
5

另一種方式是使用:respond_to?,例如,

self.respond_to? :bar, true 

注意,第二個參數是很重要的位置 - 它表示:respond_to?應該尋找所有範圍方法,包括私有方法。

+1

這應該是正確的答案! – Ginty

相關問題