在 Python 中,您可以使用 'as' 为模块设置别名:
import mymodule as mm
但我似乎找不到红宝石的等价物。我知道你可以include
而不是require
一个模块,但这有命名空间冲突的风险。是否有任何等效于 Python 模块别名的方法?
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"
迈克尔的回答似乎解决了你的问题......不过,我读了这个问题有点不同,发现了一些我认为值得分享的非常好的东西。
我将您的问题理解为:“如果我想需要两个同名的模块,我该怎么办?”,也就是说,如果需要两个模块会导致命名空间冲突,我该如何为它们取别名?因为,就我对 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 中的 A 完全覆盖。使用迈克尔的技巧也无济于事:
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
工作呢?