是否可以在Ruby中为模块创建别名?
在Python中,您可以使用“as”为模块设置别名:
import mymodule as mm
但我似乎无法找到ruby的等价物。 我知道你可以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
工作?