2012-06-18 44 views
21

在Python中,你可以設置一個別名與模塊「爲」:是否有可能在Ruby中爲模塊創建別名?

import mymodule as mm 

但我似乎無法找到紅寶石等同。我知道你可以使用include而不是require模塊,但是這會冒着命名空間衝突的風險。有沒有任何相當於Python模塊別名?

+1

'require'和'include'在ruby中有很大不同。它們不能互相交換。 – x1a4

回答

40

模塊在Ruby中是不是真的那麼特別,所以你可以將它們分配給另一個常數:

[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

哇,非常簡單的解決方案...謝謝你的迴應! –

+1

@Sean,你可以將它們分配給任何變量。你應該使用本地變量,因爲它們不會污染全局範圍。另外,您不必一直使用shift鍵。 –

21

邁克爾的答案似乎解決你的問題......不過,我看這個問題有點不同並發現了一些我認爲值得分享的東西。

我把你的問題理解爲:「如果我想要兩個同名的模塊,我該怎麼辦?」,也就是說,如果要求兩者都會導致名稱空間衝突,我怎麼會使用它們呢?因爲,就我對Python的'import ... as ...'的理解而言,它也解決了這些問題。在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 

現在,如果我想在第三個文件做到這一點:

require_relative 'a' 
require_relative 'b' 

A.greet # => other A 

第一個將完全由A在b.rb.覆蓋使用邁克爾的把戲也不會有幫助:

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

太糟糕了。然後我想,好吧,在Ruby中還有無處不在dup製作基本上所有的事,沒有太多的希望克隆我剛纔輸入這一點,並重新運行程序:

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 

這完全讓我很快樂,希望你們明白它也一樣。現在我想到了,它是有道理的 - 一個模塊畢竟是一個對象,所以爲什麼不應該dup工作?

+0

不錯,「一個模塊就像其他任何對象一樣」也是我的回答。 :-) –

+0

@MichaelKohl Heh,真的。我喜歡它,在Ruby中有很多需要探索的東西:) – emboss

+0

@emboss不錯,這是一個非常值得加入的主題。當我需要兩個具有相同名稱的模塊時,請記住它。 –

相關問題