2009-01-22 18 views
46

In Python können wir "dir" ein Modul, wie folgt aus:Ruby entspricht Pythons "dir"?

>>> import re 
>>> dir(re) 

Und es listet alle Funktionen im Modul. Gibt es eine ähnliche Möglichkeit, dies in Ruby zu tun?

+0

dir() ** auch Variablen enthält **, die in diesem Rahmen festgelegt wurden - nicht nur definierte Funktionen. – daf

+0

Siehe auch: http://stackoverflow.com/questions/2009730/ruby-equivalent-to-pythons-help –

Antwort

47

Soweit ich weiß nicht genau, aber man bekommt, irgendwo mit

object.methods.sort 
4

Sie ein Modul nehmen, wie Enumerable, und senden Sie die methods Verfahren, welches die Methoden alle das Modul definiert auflistet. Klassen, die dieses Modul enthalten, reagieren auf diese Methoden.

>> Enumerable.methods 
=> ["inspect", "private_class_method", "const_missing", "clone", "method", "public_methods", "public_instance_methods", "instance_variable_defined?", "method_defined?", "equal?", "freeze", "included_modules", "const_get", "yaml_as", "methods", "respond_to?", "module_eval", "class_variables", "dup", "protected_instance_methods", "instance_variables", "public_method_defined?", "__id__", "object_id", "taguri", "yaml_tag_read_class", "eql?", "const_set", "id", "to_yaml", "taguri=", "singleton_methods", "send", "class_eval", "taint", "frozen?", "instance_variable_get", "include?", "private_instance_methods", "__send__", "instance_of?", "private_method_defined?", "to_a", "name", "to_yaml_style", "autoload", "type", "yaml_tag_class_name", "<", "protected_methods", "instance_eval", "<=>", "==", ">", "display", "===", "instance_method", "instance_variable_set", "to_yaml_properties", "kind_of?", "extend", "protected_method_defined?", "const_defined?", ">=", "ancestors", "to_s", "<=", "public_class_method", "hash", "class", "instance_methods", "tainted?", "=~", "private_methods", "class_variable_defined?", "nil?", "untaint", "constants", "autoload?", "is_a?"] 
1

ich gehen würde, für so etwas wie folgt aus:

y String.methods.sort 

, die Ihnen eine yaml Darstellung der sortierten Array von Methoden geben. Beachten Sie, dass dies verwendet werden kann, um die Methoden von Klassen und Objekten aufzulisten.

4

Tipp für ein Verfahren in irb „Suche“:

"something".methods.select {|item| item =~ /query/ } 

Tipps für die zum Vergleich auf einem Wert Methoden auszuprobieren:

value = "something" 
[:upcase, :downcase, :capitalize].collect {|method| [method, value.send(method)] } 

Beachten Sie auch, dass Sie nicht alle erhalten die gleichen Informationen wie Pythons dir mit object.methods. Sie müssen eine Kombination aus object.methods und class.constants, also class.singleton_methods verwenden, um die Klassenmethoden zu erhalten.

0

Nicht wirklich. Wie die anderen sagten, können Sie einen Teil Ihrer Wünsche erfüllen, indem Sie Klasseninstanzmethoden auflisten (z. B. String.instance_methods), aber das hilft Ihnen nicht, wenn eine geöffnete Datei eine Klasse wieder öffnet (außer Sie checken vorher und nachher).

Wenn Sie keinen programmatischen Zugriff auf die Methodenliste benötigen, sollten Sie die Dokumentation für eine Klasse, ein Modul oder eine Methode mit dem Befehlszeilentool ri aufrufen.

0

Ich hätte dies zu Jonelfs Antwort kommentiert, aber anscheinend habe ich nicht genug Rep.

some_object.methods.sort - Object.new.methods

Dies ist nicht genau das, was Sie gefragt wurden, wie andere gesagt haben, aber es gibt Ihnen die Informationen, die Sie nach sind.

0

Wenn ich deine Frage genau lese, muss ich sie so beantworten: Eine Datei wie in require in Ruby angegeben, ist nur ein Container und muss keine Beziehung zu einer Klasse haben. Der Inhalt kann sein:

  • eine Klasse
  • ein Modul
  • Klar Code

oder eine beliebige Kombination der oben genannten, mehrmals. Sie können also nicht direkt nach allen Methoden in einer Datei fragen.

Wenn Sie alle Methoden eines bestimmten Moduls oder einer Klasse auflisten möchten, sind die anderen Antworten das, wonach Sie suchen (hauptsächlich unter Verwendung der #methods-Methode für einen Modulnamen oder eine Klasse).

17

Ich mag in meinem .irbrc haben:

class Object 
    def local_methods 
    (methods - Object.instance_methods).sort 
    end 
end 

Also, wenn ich in irb bin:

>> Time.now.local_methods 
=> ["+", "-", "<", "<=", "<=>", ">", ">=", "_dump", "asctime", "between?", "ctime", "day", "dst?", "getgm", "getlocal", "getutc", "gmt?", "gmt_offset", "gmtime", "gmtoff", "hour", "isdst", "localtime", "mday", "min", "mon", "month", "sec", "strftime", "succ", "to_f", "to_i", "tv_sec", "tv_usec", "usec", "utc", "utc?", "utc_offset", "wday", "yday", "year", "zone"] 

Oder sogar cuter - mit grep:

>> Time.now.local_methods.grep /str/ 
=> ["strftime"] 
+0

Vielen Dank, ich lerne Ruby von Python und das ist eine große Hilfe. – edef

+0

Nur neugierig auf Ihren Methodennamen, was ist eine "lokale" Methode? Da globale Methoden statische Methoden sind, vermute ich, dass lokale Methoden Instanzmethoden sind? – Dennis

0

Vielleicht nicht die ursprüngliche Frage zu beantworten (hängt vom Anwendungsfall ab), aber für diejenigen, die danach suchen, wird diese imverwendet Nur 10, können Sie "Doppel-TAB" für Autovervollständigung verwenden. Dies kann effektiv (fast alle) die für ein bestimmtes Objekt verfügbaren Methoden auflisten.

Setzen Sie die folgende Zeile in Ihre ~/.irbrc Datei:

require 'irb/completion' 

nun (wieder) die irb starten, starten Sie eine Methode eingeben und drücken Sie TAB zweimal - irb autocompletes die Eingabe!

ich lernte es tatsächlich hier: http://drnicwilliams.com/2006/10/12/my-irbrc-for-consoleirb/