ruby orientado a objetos




¿Es posible hacer un alias para un módulo en Ruby? (2)

En Python, puedes establecer un alias para un módulo con 'como':

import mymodule as mm

Pero parece que no puedo encontrar un equivalente para ruby. Sé que puede include un módulo en lugar de require , pero esto conlleva riesgos de colisiones de espacio de nombres. ¿Hay algún equivalente a los alias del módulo Python?


La respuesta de Michael parece resolver tu pregunta ... aún así, leí la pregunta un poco diferente y descubrí algo realmente agradable que pensé que valía la pena compartir.

Entendí tu pregunta como: "¿Qué hago si quiero requerir dos módulos con el mismo nombre?", Es decir, ¿cómo podría crear un alias si al exigir ambos resultaría en un choque de espacio de nombres? Porque, en lo que respecta a mi comprensión de la importancia de Python 'como ...', también resuelve ese tipo de problemas. Un ejemplo en Ruby:

#file a.rb
module A
  def self.greet
    puts 'A'
  end
end

#file b.rb
module A
  def self.greet
    puts 'other A'
  end
end

Ahora si quisiera hacer esto en un tercer archivo:

require_relative 'a'
require_relative 'b'

A.greet # => other A

la primera A sería completamente anulada por la A en b.rb. Usar el truco de Michael tampoco ayudará:

require_relative 'a'
TMP_A = A
A.greet # => A
TMP_A.greet # => A
require_relative 'b'
TMP_A2 = A
A.greet # => other A
TMP_A2.greet # => other A
TMP_A.greet # => other A :(

Demasiado. Entonces pensé, bueno, en Ruby está el dup omnipresente para hacer un clon de prácticamente todo y sin demasiada esperanza, simplemente escribí esto y volví a ejecutar el programa:

require_relative 'a'
TMP_A = A.dup
A.greet # => A
TMP_A.greet # => A
require_relative 'b'
TMP_A2 = A
A.greet # => other A
TMP_A2.greet # => other A
TMP_A.greet # => A :P

Eso hizo mi día totalmente, espero que ustedes también lo aprecien. Ahora que lo pienso, tiene sentido: un módulo es un objeto como cualquier otro, después de todo, ¿por qué no debería funcionar el dup ?


Los módulos en Ruby no son realmente tan especiales, así que puedes asignarlos a otra constante:

[4] (pry) main: 0> module TestModule
[4] (pry) main: 0*   def self.foo
[4] (pry) main: 0*     "test"
[4] (pry) main: 0*   end  
[4] (pry) main: 0* end  
=> nil
[5] (pry) main: 0> tm = TestModule
=> TestModule
[6] (pry) main: 0> tm.foo
=> "test"




alias