¿Rubí equivalente al "dir" de Python?
ruby inspection (9)
En Python podemos "dirigir" un módulo, como este:
>>> import re
>>> dir(re)
Y enumera todas las funciones en el módulo. ¿Hay alguna manera similar de hacer esto en Ruby?
Habría hecho un comentario a la respuesta de jonelf, pero aparentemente no tengo suficiente reputación.
some_object.methods.sort - Object.new.methods
Esto no es exactamente lo que preguntaba, como otros han dicho, pero le da la información que busca.
Iría por algo como esto:
y String.methods.sort
Lo que le dará una representación en yaml de la matriz ordenada de métodos. Tenga en cuenta que esto se puede utilizar para enumerar los métodos de ambas clases y objetos.
Por lo que sé, no exactamente, pero llegas a algún lado con
object.methods.sort
Puede tomar un módulo, como Enumerable
, y enviar el método de methods
que enumera todos los métodos que define el módulo. Las clases que incluyen este módulo responderán a estos métodos.
>> 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?"]
Realmente no. Como dijeron los demás, puede obtener parte de lo que desea al listar métodos de instancia de clase (por ejemplo, String.instance_methods
), pero eso no le ayuda si un archivo que abre vuelve a abrir una clase (a menos que verifique antes y después).
Si no necesita acceso programático a la lista de métodos, considere verificar la documentación de una clase, módulo o método utilizando la herramienta de línea de comandos ri
.
Si leí su pregunta con rigor, debo responderla de la siguiente manera: un archivo especificado por require
en Ruby es solo un contenedor y no tiene necesariamente ninguna relación con una clase. El contenido puede ser:
- una clase
- un módulo
- código simple
o cualquier combinación de los anteriores, varias veces. Por lo tanto, no puede solicitar directamente todos los métodos en un archivo determinado.
Si quisiste enumerar todos los métodos de un módulo o clase dado, entonces las otras respuestas son lo que buscas (principalmente usando el método #methods
en un nombre o clase de módulo).
Sugerencia para "buscar" un método en irb:
"something".methods.select {|item| item =~ /query/ }
Sugerencia para probar métodos en un valor para comparación:
value = "something"
[:upcase, :downcase, :capitalize].collect {|method| [method, value.send(method)] }
Además, tenga en cuenta que no obtendrá la misma información que el directorio de Python con object.methods. Debe usar una combinación de object.methods y class.constants, también class.singleton_methods para obtener los métodos de clase.
Me gusta tener esto en mi .irbrc:
class Object
def local_methods
(methods - Object.instance_methods).sort
end
end
Entonces cuando estoy en irb:
>> 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"]
O incluso más lindo - con grep:
>> Time.now.local_methods.grep /str/
=> ["strftime"]
Tal vez no responda la pregunta original (depende del caso de uso), pero para aquellos que buscan que esto se use solo en el irb
, puede usar "doble TAB" para autocompletar. Lo cual, efectivamente, también puede listar (casi todos) los métodos disponibles para un objeto dado.
Coloque la siguiente línea en su archivo ~/.irbrc
:
require ''irb/completion''
Ahora, (re) inicie el irb
, comience a escribir un método y presione TAB dos veces, ¡la IRB autocompleta la entrada!
De hecho, lo aprendí aquí: http://drnicwilliams.com/2006/10/12/my-irbrc-for-consoleirb/