2012-06-18 5 views
21

In Python können Sie einstellen, ein Alias ​​für ein Modul mit ‚als‘: scheinenIst es möglich, einen Alias ​​für ein Modul in Ruby zu erstellen?

import mymodule as mm 

Aber ich kann kein Äquivalent für Ruby zu finden. Ich weiß, dass Sie include eher als require ein Modul, aber das Risiko Namespace Kollisionen. Gibt es äquivalente Python-Modul-Aliase?

+1

'require' und' include' sind in Rubin sehr unterschiedlich. Sie sind nicht untereinander austauschbar. – x1a4

Antwort

40

Module in Ruby sind nicht wirklich so speziell, so dass Sie sie auf eine andere Konstante nur zuordnen:

[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, sehr einfache Lösung ... danke für die Antwort! –

+1

@Sean, Sie können sie jeder Variablen zuweisen. Sie sollten lokale Variablen verwenden, da sie den globalen Geltungsbereich nicht beeinträchtigen. Außerdem müssen Sie nicht ständig die Umschalttaste drücken. –

21

Michaels Antwort scheint Ihre Frage ... noch zu lösen, ich lese die Frage etwas anders und entdeckte etwas wirklich Schönes, das ich wert war, geteilt zu werden.

Ich habe Ihre Frage wie folgt verstanden: "Was mache ich, wenn ich zwei Module mit demselben Namen benötige?", Das heißt, wie könnte ich sie aliasieren, wenn beide Anforderungen zu einem Namespace-Konflikt führen würden? Weil, so weit mein Verständnis von Pythons "Import ... as ..." geht, löst es auch diese Art von Problemen. Ein Beispiel 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 

Nun, wenn ich dies in einer dritten Datei tun würde:

require_relative 'a' 
require_relative 'b' 

A.greet # => other A 

die erste A würde vollständig von der A in b.rb. außer Kraft gesetzt werden Mit Michael's Trick hilft auch nicht:

Schade. Dann dachte ich, na ja, in Ruby gibt es die allgegenwärtige dup zur Herstellung eines Klons von im Grunde alles, und ohne zu viel Hoffnung, die ich dies gerade eingegeben und reran das Programm:

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 

Das total mein Tag, hoffe, euch zu schätzen wissen es genauso gut. Nun, da ich darüber nachdenke, macht es Sinn - ein Modul ist ein Objekt wie jedes andere auch, also warum sollte dup nicht funktionieren?

+0

Schön, "ein Modul ist ein Objekt wie jeder andere auch" war irgendwie der Punkt meiner Antwort auch. :-) –

+0

@MichaelKohl Heh, stimmt. Ich liebe es, es gibt so viel zu entdecken in Ruby :) – emboss

+0

@emboss Schön, das ist eine sehr würdige Ergänzung zu diesem Thema. Behalte es im Hinterkopf, wenn ich zwei Module mit dem gleichen Namen brauche. –

Verwandte Themen