Est-il possible de faire un alias pour un module dans Ruby?
En Python, vous pouvez définir un alias pour un module avec "comme":
import mymodule as mm
, Mais je n'arrive pas à trouver un équivalent pour ruby. Je sais que vous pouvez include
plutôt que require
un module, mais cela risque des collisions d'espaces de noms. Existe-t-il un équivalent aux alias de module Python?
2 réponses
Les Modules dans Ruby ne sont pas vraiment si spéciaux, donc vous pouvez simplement les assigner à une autre 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"
La réponse de Michael semble résoudre votre question... pourtant, j'ai lu la question un peu différemment et j'ai découvert quelque chose de vraiment sympa que je pensais valoir la peine de partager.
J'ai compris votre question comme: "Que dois-je faire si je veux avoir besoin de deux modules du même nom?", c'est-à-dire, comment pourrais-je les alias si l'exigence des deux entraînerait un conflit d'espace de noms? Parce que, pour autant que je comprenne l'importation de Python ... comme ..."va, il résout aussi ce genre de problèmes. Un exemple 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
Maintenant, si je le ferais dans un troisième fichier:
require_relative 'a'
require_relative 'b'
A.greet # => other A
Le premier A serait complètement remplacé par le A dans B. rb. Utiliser le truc de Michael n'aidera pas non plus:
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 :(
Dommage. Ensuite, j'ai pensé, Eh bien, dans Ruby il y a l'omniprésent dup
pour faire un clone de fondamentalement tout et sans trop d'espoir, je viens de taper ceci et de rediriger le programme:
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
Cela a totalement fait ma journée, j'espère que vous l'apprécierez autant. Maintenant que j'y pense, il sens - un module est un objet comme les autres après tout, alors pourquoi ne pas dup
travail?