【问题标题】:Is it possible to make an alias for a module in Ruby?是否可以在 Ruby 中为模块创建别名?
【发布时间】:2012-06-18 22:00:47
【问题描述】:

在 Python 中,您可以使用 'as' 为模块设置别名:

import mymodule as mm

但我似乎找不到 ruby​​ 的等价物。我知道你可以include 而不是require 一个模块,但这有命名空间冲突的风险。有没有与 Python 模块别名等效的东西?

【问题讨论】:

  • requireinclude 在 ruby​​ 中非常不同。它们不能相互互换。

标签: ruby module alias


【解决方案1】:

Michael 的回答似乎解决了您的问题……不过,我读到的问题有点不同,发现了一些我认为值得分享的非常好的东西。

我将您的问题理解为:“如果我想要求两个同名模块,我该怎么办?”也就是说,如果同时要求两个模块会导致命名空间冲突,我该如何给它们起别名?因为,就我对 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 不应该工作呢?

【讨论】:

  • 很好,“一个模块毕竟是一个像其他任何对象一样的对象”也是我回答的重点。 :-)
  • @MichaelKohl 嘿,真的。我喜欢它,Ruby 中有很多值得探索的地方:)
  • @emboss 很好,这是对这个线程的一个非常有价值的补充。当我需要两个具有相同名称的模块时会记住这一点。
  • @emboss 为了帮助其他人找到这个答案,您可能想询问您对问题的解释,然后将其作为答案发布。
【解决方案2】:

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"

【讨论】:

  • @Sean,您可以将它们分配给任何变量。您应该使用局部变量,因为它们不会污染全局范围。此外,您不必一直使用 shift 键。
猜你喜欢
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
相关资源
最近更新 更多