2015-11-19 11 views
5

definiert ist Die nächste, die ich finden kann, ist In Ruby, how do I check if method "foo=()" is defined?, aber es funktioniert nur, wenn die Methode öffentlich ist, auch wenn innerhalb des Klassenblocks.Wie überprüft man, ob private Methode in Ruby

Was ich will:

class Foo 
    private 

    def bar 
    "bar" 
    end 

    magic_private_method_defined_test_method :bar #=> true 
end 

Was ich versucht habe:

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

Seitennotiz: Ich habe mich * wirklich * gewundert und die Antwort im Verlauf des Schreibens der Frage entdeckt. Posted hier, da ich meine Antwort nicht leicht finden konnte und so hoffe ich, dass der nächste Kerl in der Lage sein wird. – Shelvacu

Antwort

7

Sie Module# private_method_defined? wollen.

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

Eine andere Möglichkeit ist die Verwendung von :respond_to?, z.B.

self.respond_to? :bar, true 

Beachten Sie, dass der zweite Parameter ist hier wichtig ist - es bedeutet, dass :respond_to? für alle Rahmen Methoden einschließlich privater Methoden aussehen sollte.

+1

Dies sollte die richtige Antwort sein! – Ginty

Verwandte Themen