2012-03-26 20 views
14

Usando pry, es muy simple encontrar dónde se define un método y ver la fuente mediante el comando edit-method. Sin embargo, no hay correspondencia para la clase en sí. Cuando esa clase no tiene ningún método definido por sí mismo, es difícil localizar la fuente a través del pry.¿Cómo puedo encontrar dónde se define una constante en Ruby?

Las clases son constantes, por lo que es equivalente a preguntar dónde encontrar la fuente en la que se define una determinada constante de Ruby. Muchas gracias.

+1

¿Qué 'grep'? – Arsen7

+3

¿Podría aceptar respuestas a sus preguntas anteriores? – Arsen7

+4

@ Arsen7 Muchas gracias por recordarme. Soy bastante nuevo en esta comunidad. Los he aceptado ahora. –

Respuesta

6

Uso ack, a veces si alcanzo los límites de la palanca (y Ruby) recurro a usarlo. Lo bueno de esto es que puedes invocarlo desde dentro de Pry usando sus características de integración de shell, generalmente solo escribiendo .ack ClassName hace el truco, sin embargo requiere que la clase esté definida en un archivo bajo el directorio actual.

En el caso de que la clase no esté definida en el directorio actual, siempre puede recurrir a buscar uno de sus métodos, tomar la ubicación de origen desde allí y luego usar el comando cat de Pry para mostrarla (con sintaxis resaltado) o el comando edit de Pry para saltar directamente a su definición.

El caso en el que una clase no tiene ningún a métodos definidos es bastante raro - y una clase tal es por lo general bastante poco interesante de todos modos :)

EDITAR:

La versión más reciente de palanca (0.9.9) ahora puede mostrar el origen de los módulos/clases usando el comando normal show-source. Requiere que el módulo/clase tenga al menos un método definido. Sin embargo,

1

Bien podría intentar Module.constants(true) como se indica here Puede ser que tome un poco más que el uso pry ofertas pero que le permitirá la oportunidad de mirar en los módulos involucrados

+0

No parece que haya una manera de encontrar la ubicación de origen a partir de esto. –

2

Si la constante que busca tiene métodos (es una clase o módulo) puede usar la clase Método para averiguar dónde está definida.

class Foo 
    def bar 
    end 

    def self.baz 
    end 
end 

Foo.instance_method(:bar).source_location 
Foo.method(:baz).source_location 

Un poco de un truco y no ayuda con constantes puros class Foo; BAHZ = 2; end pero es mejor que nada.

6

En ruby, $" contiene todos los nombres de archivo que se cargan a través de Kernel.load. lo que podría intentar algo como esto:

constant = User 
$".detect{|load_path| 
    load_path.include?(constant.to_s.underscore) 
} 

Nota: El método underscore es parte de rieles/ActiveSupport

+0

¡Esta es una gran sugerencia! – sandstrom

+0

Gran respuesta. Encontré 'guión bajo 'no estaba disponible para mí en String on Ruby 2.4.2. Me las arreglé con 'downcase', pero si tu nombre de clase es varias palabras, necesitarías convertirlo en caso de serpiente de alguna manera. –

Cuestiones relacionadas