en ruby, ¿cómo puedo saber qué módulo se define como resultado de una 'carga' o 'requerimiento'?

StackOverflow https://stackoverflow.com/questions/451347

  •  19-08-2019
  •  | 
  •  

Pregunta

En ruby, si requiero "foo", ¿hay alguna forma de determinar posteriormente el nombre del módulo o módulos definidos en foo.rb?

Por ejemplo, supongamos que tengo un archivo ruby ??llamado foo.rb que tiene este aspecto:

# foo.rb
module MyModule
    def self.summary
        "this does something useful"
    end
    ...
end

En otro script, después de que requiero "foo", ¿cómo puedo determinar que ahora tengo un módulo llamado MyModule?

Lo último que busco es poder hacer algo como esto:

file = someComputedFileName()
require file
puts "summary of #{file}: #{???::summary}

Si bien podría obligarme a hacer que los nombres de los módulos y los nombres de los archivos sean idénticos, prefiero no hacerlo. Quiero un poco más de libertad para crear nombres de archivo cortos pero nombres de módulos más expresivos. Sin embargo, me garantizo que cada archivo solo definirá un único módulo (piense: complementos).

¿Fue útil?

Solución

Un enfoque sería utilizar ObjectSpace .each_object (Módulo ) para encontrar todos los módulos definidos antes de requerir el archivo. Luego, después de que requiera el archivo, repita todos los módulos definidos nuevamente y vea si hay alguno nuevo.

require "set"
old_modules = SortedSet.new
ObjectSpace.each_object(Module) {|m| old_modules.add(m) }

file = someComputedFileName()
require file

new_modules = SortedSet.new
ObjectSpace.each_object(Module) {|m| new_modules.add(m) unless old_modules.include?(m) }

puts "summary of #{file}: #{new_modules.to_a.map{|m|m.summary}.join(',')}"

Eso también le permitiría definir más de un módulo en el archivo.

Otros consejos

No sé si esta es la mejor solución, pero parece que funciona:

all_constants = Object.constants
require 'foo'

foo_constants = Object.constants - all_constants

foo_constants debería proporcionarle solo los módulos, clases u otras constantes definidas por foo.rb.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top