2012-06-18 13 views
21

En Python, puede establecer un alias para un módulo con 'como':¿Es posible crear un alias para un módulo en Ruby?

import mymodule as mm 

Pero me parece que no puede encontrar un equivalente de rubí. Sé que puede include en lugar de require un módulo, pero esto arriesga las colisiones del espacio de nombres. ¿Hay algún equivalente a los alias de módulos de Python?

+1

'require' y' include' son muy diferentes en ruby. No son intercambiables entre sí. – x1a4

Respuesta

40

módulos en Ruby no son realmente tan especial, por lo que sólo les puede asignar 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" 
+1

Guau, solución muy simple ... ¡gracias por la respuesta! –

+1

@Sean, puede asignarlos a cualquier variable. Debe usar variables locales porque no contaminarán el alcance global. Además, no tendrá que usar la tecla Mayús todo el tiempo. –

21

respuesta de Michael parece resolver su pregunta ... todavía, leí la pregunta un poco diferente y descubrí algo realmente bueno que pensé que valía la pena compartir.

Entendí su pregunta como: "¿Qué hago si quiero requerir dos módulos del mismo nombre?", Es decir, ¿cómo podría alias si requerir ambos resultaría en un conflicto de espacio de nombres? Porque, en lo que respecta a mi comprensión de la 'importación ... como ...' de Python, 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 bien, si me gustaría hacer esto en un tercer archivo:

require_relative 'a' 
require_relative 'b' 

A.greet # => other A 

la primera A sería completamente anulado 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 :(

Muy mal. Entonces pensé, bien, en Ruby está el omnipresente dup para hacer un clon de básicamente todo y sin demasiada esperanza que acaba de escribir esto y volvió 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 totalmente mi día, espero que ustedes aprecian tanto como bien. Ahora que lo pienso, tiene sentido, un módulo es un objeto como cualquier otro después de todo, entonces ¿por qué no debería funcionar dup?

+0

Agradable, "un módulo es un objeto como cualquier otro después de todo" fue también el punto de mi respuesta. :-) –

+0

@MichaelKohl Heh, cierto. Me encanta, hay tanto por explorar en Ruby :) – emboss

+0

@emboss Nice, esta es una adición muy valiosa a este hilo. Lo tendré en cuenta cuando necesite dos módulos con el mismo nombre. –

Cuestiones relacionadas