2015-11-19 17 views
5

Najbliższe, co mogę znaleźć, to In Ruby, how do I check if method "foo=()" is defined?, ale działa tylko wtedy, gdy metoda jest jawna, nawet jeśli znajduje się w bloku klasy.Jak sprawdzić, czy metoda prywatna jest zdefiniowana w ruby?

Czego chcę:

class Foo 
    private 

    def bar 
    "bar" 
    end 

    magic_private_method_defined_test_method :bar #=> true 
end 

Co próbowałem:

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 boczna: Byłem * właściwie * zastanawiałem się nad tym i odkryłem odpowiedź w trakcie pisania pytania. Zamieszczone tutaj, ponieważ nie mogłem łatwo znaleźć odpowiedzi, więc mam nadzieję, że następna osoba będzie w stanie. – Shelvacu

Odpowiedz

7

Chcesz 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

Innym sposobem jest użycie :respond_to?, np.

self.respond_to? :bar, true 

Zauważ, że drugi parametr jest tu ważne - to oznacza, że ​​:respond_to? powinien wyglądać dla wszystkich metod zakresie obejmującym metod prywatnych.

+1

To powinna być właściwa odpowiedź! – Ginty

Powiązane problemy