Подтвердить что ты не робот

Возможно ли сделать псевдоним для модуля в Ruby?

В Python вы можете установить псевдоним для модуля с 'as':

import mymodule as mm

Но я не могу найти эквивалент для ruby. Я знаю, что вы можете include, а не require модуль, но это приводит к конфликтам пространства имен. Есть ли эквивалент псевдонимам модуля Python?

4b9b3361

Ответ 1

Модули в 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"

Ответ 2

Майкл ответ, кажется, решает ваш вопрос... все же, я немного по-другому прочитал вопрос и обнаружил что-то действительно приятное, что я думал, что стоит поделиться.

Я понял ваш вопрос как: "Что мне делать, если я хочу потребовать два модуля с одним и тем же именем?", то есть как я мог бы их перечислить, если они потребуют обоих, приведет к столкновению пространства имен? Потому что, насколько я понимаю, что Python "импортирует... как...", он также решает эти проблемы. Пример в 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 будет полностью переопределен A в b.rb. Использование трюка Майка также не поможет:

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 работать?