Возможно ли сделать псевдоним для модуля в Ruby?
В Python вы можете установить псевдоним для модуля с 'as':
import mymodule as mm
Но я не могу найти эквивалент для ruby. Я знаю, что вы можете include
, а не require
модуль, но это приводит к конфликтам пространства имен. Есть ли эквивалент псевдонимам модуля Python?
Ответы
Ответ 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
работать?