29

Pythonでは、「as」を使用してモジュールのエイリアスを設定できます。

import mymodule as mm

しかし、私はルビーに相当するものを見つけることができないようです。includeモジュールではなくできることは知っていますがrequire、これは名前空間の衝突のリスクがあります。Pythonモジュールエイリアスに相当するものはありますか?

4

2 に答える 2

48

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"
于 2012-06-18T22:04:21.163 に答える
28

マイケルの答えはあなたの質問を解決するようです.

私はあなたの質問を次のように理解しました:「同じ名前の 2 つのモジュールを要求したい場合はどうすればよいですか?」つまり、両方を要求すると名前空間の衝突が発生する場合、どうすればエイリアスを作成できますか? なぜなら、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

これを 3 番目のファイルで行うとしたら、次のようになります。

require_relative 'a'
require_relative 'b'

A.greet # => other A

最初の A は、b.rb の A によって完全にオーバーライドされます。Michael のトリックを使用しても役に立ちません。

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機能しないのでしょうか?

于 2012-06-18T22:36:22.367 に答える