2012-01-13 12 views
25

Dato qualsiasi oggetto, posso chiamare #public_methods e vedere tutti i metodi a cui risponderà. Tuttavia, trovo che a volte sarebbe utile avere una lista veloce di tutti i metodi pubblici che non sono ereditati, cioè le cose che fanno veramente parte di questa classe.Come ottengo i metodi pubblici di una classe senza metodi ereditati?

ho trovato in "Easy way to list public methods for a Ruby object" che se uso:

(Foo.public_methods - Object.public_methods).sort 

posso filtrare fuori un sacco di cose di base Ruby. Mi piacerebbe essere in grado di filtrare tutto ciò che è stato ereditato lungo tutta la catena. Se conosco la classe genitore, posso filtrarla usando questo, ma mi piacerebbe creare un comando generico che possa restituire una matrice di metodi pubblici non ereditati per qualsiasi oggetto.

risposta

45

Basta passare false per la inherited argomento public_methods:

"hello".public_methods.include?(:dup) # => true 
"hello".public_methods(false).include?(:dup) # => false 

Non è una risposta alla tua domanda, ma nel caso non lo sapeste, irb fa completamento automatico, quindi è facile per ottenere l'elenco di pubblico metodi (specialmente se conosci l'inizio del metodo che stai cercando). Basta premere scheda; colpendo due volte elencherà tutte le possibilità (compresi quelli ereditati, però):

> "nice".d<tab><tab> 
"nice".delete  "nice".delete! "nice".display "nice".downcase     
"nice".downcase! "nice".dump  "nice".dup  "nice".define_singleton_method 

> "nice".<tab><tab> 
Display all 162 possibilities? (y or n) 
... 

Utilizzando pry rende ancora più facile per vedere i metodi disponibili, suddivisi per livello di eredità:

[1] pry(main)> cd "nice" 
[2] pry("nice"):1> ls 
Comparable#methods: < <= > >= between? 
String#methods: % * + << <=> == === =~ [] []= ascii_only? bytes bytesize byteslice capitalize capitalize! casecmp center chars chomp chomp! chop chop! chr clear codepoints concat count crypt delete delete! downcase downcase! dump each_byte each_char each_codepoint each_line empty? encode encode! encoding end_with? eql? force_encoding getbyte gsub gsub! hash hex include? index insert inspect intern length lines ljust lstrip lstrip! match next next! oct ord partition prepend replace reverse reverse! rindex rjust rpartition rstrip rstrip! scan setbyte shellescape shellsplit size slice slice! split squeeze squeeze! start_with? strip strip! sub sub! succ succ! sum swapcase swapcase! to_c to_f to_i to_r to_s to_str to_sym tr tr! tr_s tr_s! unpack upcase upcase! upto valid_encoding? 
locals: _ _dir_ _ex_ _file_ _in_ _out_ _pry_ 
+0

volevi dire "irb" o "irc"? :-) –

+0

Infatti, 'irb'. Grazie a te e @Mu –

+0

Ah, super utile! Non mi ero reso conto che '# public_methods' accettava alcun argomento, e non mi era nemmeno venuto in mente di controllarlo. Grazie! – Andrew

5

Date guarda Module#instance_methods

È possibile utilizzare il seguente:

class A 
    def method_1 
    puts "method from A" 
    end 
end 

class B < A 
    def method_2 
    puts "method from B" 
    end 
end 

B.instance_methods  # => [:method_1, :method_2, ...] 
B.instance_methods(false) # => [:method_2] 
Problemi correlati