2015-11-19 9 views
5

Il più vicino che riesco a trovare è In Ruby, how do I check if method "foo=()" is defined?, ma funziona solo se il metodo è pubblico, anche quando si trova all'interno del blocco di classe.Come verificare se il metodo privato è definito in ruby ​​

quello che voglio:

class Foo 
    private 

    def bar 
    "bar" 
    end 

    magic_private_method_defined_test_method :bar #=> true 
end 

Quello che ho provato:

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

Nota a margine: mi chiedevo * effettivamente * e ho scoperto la risposta nel corso della stesura della domanda. Inserito qui perché non sono riuscito a trovare facilmente la mia risposta e quindi spero che il prossimo sia in grado di farlo. – Shelvacu

risposta

7

Volete 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

Un altro modo è utilizzare :respond_to?, ad es.

self.respond_to? :bar, true 

Nota che il secondo parametro è importante qui - denota che :respond_to? dovrebbe cercare tutti i metodi di portata compresi i metodi privati.

+1

Questa dovrebbe essere la risposta giusta! – Ginty