Sea*_*sey 26 ruby alias module
在Python中,您可以使用"as"为模块设置别名:
import mymodule as mm
Run Code Online (Sandbox Code Playgroud)
但我似乎无法找到红宝石的等价物.我知道你可以include而不是require一个模块,但这会冒命名空间冲突的风险.有没有相当于Python模块别名?
Mic*_*ohl 43
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"
Run Code Online (Sandbox Code Playgroud)
emb*_*oss 24
迈克尔的答案似乎解决了你的问题......但是,我有点不同地阅读了这个问题,发现了一些我认为值得分享的非常好的东西.
我理解你的问题是:"如果我想要两个同名的模块,我该怎么办?",也就是说,如果要求两者都会导致命名空间冲突,我怎么能将它们别名?因为,就我对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
Run Code Online (Sandbox Code Playgroud)
现在,如果我在第三个文件中执行此操作:
require_relative 'a'
require_relative 'b'
A.greet # => other A
Run Code Online (Sandbox Code Playgroud)
第一个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 :(
Run Code Online (Sandbox Code Playgroud)
太糟糕了.然后我想,好吧,在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
Run Code Online (Sandbox Code Playgroud)
这完全是我的一天,希望你们能够尽情地欣赏它.现在我想一想,它是有道理的 - 毕竟模块是一个像任何其他的对象,所以为什么不应该dup工作?
| 归档时间: |
|
| 查看次数: |
8707 次 |
| 最近记录: |