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?

23
demandé sur Sean Mackesey 2012-06-19 02:00:47

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"
41
répondu Michael Kohl 2015-11-26 09:54:02

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?

23
répondu emboss 2012-06-18 22:41:33