2012-06-18 2 views
21

In Python, è possibile impostare un alias per un modulo con 'come':È possibile creare un alias per un modulo in Ruby?

import mymodule as mm 

Ma io non riesco a trovare un equivalente per Ruby. So che puoi include piuttosto che require un modulo, ma questo rischia di collisioni nello spazio dei nomi. C'è qualche equivalente agli alias del modulo Python?

+1

'require' e' include' sono molto diversi in ruby. Non sono intercambiabili tra loro. – x1a4

risposta

40

moduli in Ruby non sono poi così speciale, così puoi semplicemente assegnarli ad un'altra costante:

[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

Wow, soluzione molto semplice ... grazie per la risposta! –

+1

@Sean, puoi assegnarli a qualsiasi variabile. È necessario utilizzare variabili locali perché non inquinano l'ambito globale. Inoltre, non dovrai usare il tasto Maiusc per tutto il tempo. –

21

risposta di Michael sembra risolvere la tua domanda ... ancora, ho letto la domanda un po 'diverso e ho scoperto qualcosa di veramente bello che ho pensato valesse la pena condividere.

Ho capito la tua domanda come: "Cosa devo fare se voglio richiedere due moduli con lo stesso nome?", Cioè, come potrei renderli alias se richiedere entrambi comporterebbe uno scontro di namespace? Perché, per quanto riguarda la mia comprensione dell'importanza di Python come ..., ... risolve anche questo tipo di problemi. Un esempio in 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 

Ora, se io farei questo in un terzo file:

require_relative 'a' 
require_relative 'b' 

A.greet # => other A 

il primo A sarebbe completamente annullata dalla A in b.rb. Anche l'utilizzo del trucco di Michael non aiuta:

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 :(

Peccato. Poi ho pensato, bene, in Ruby c'è l'onnipresente dup per fare un clone di praticamente tutto e senza troppa speranza ho scritto questo e reran il programma:

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 

Quella totalmente fatto il mio giorno, spero voi ragazzi apprezzano altrettanto bene. Ora che ci penso, ha senso - un modulo è un oggetto come gli altri dopotutto, quindi perché non dovrebbe funzionare dup?

+0

Bello, "dopo tutto un modulo è un oggetto come tutti gli altri" era anche il punto della mia risposta. :-) –

+0

@MichaelKohl Heh, vero. Lo adoro, c'è così tanto da esplorare in Ruby :) – emboss

+0

@emboss Nice, questa è un'aggiunta molto degna di questa discussione. Lo terrò a mente per quando avrò bisogno di due moduli con lo stesso nome. –