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

В Python вы можете установить псевдоним для модуля с помощью «как»:

import mymodule as mm

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

 x1a419 июн. 2012 г., 00:07
require а такжеinclude очень разные в рубине. Они не взаимозаменяемы друг с другом.

Ответы на вопрос(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 Mackesey19 июн. 2012 г., 00:11
Вау, очень простое решение ... спасибо за ответ!
 19 июн. 2012 г., 14:10
@Sean, вы можете назначить их любой переменной. Вы должны использовать локальные переменные, потому что они не будут загрязнять глобальную область видимости. Кроме того, вам не придется все время использовать клавишу Shift.

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

Я понял ваш вопрос следующим образом: «Что мне делать, если мне нужны два модуля с одним и тем же именем?», То есть, как я могу присвоить им псевдоним, если требование того и другого приведет к конфликту пространства имен? Потому что, насколько я понимаю, Python 's 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 был бы полностью переопределен 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 Работа?

 Sean Mackesey19 июн. 2012 г., 20:37
@emboss Ницца, это очень достойное дополнение к этой теме. Буду иметь в виду, когда мне понадобятся два модуля с одинаковым именем.
 13 дек. 2016 г., 14:22
@emboss Чтобы помочь другим найти этот ответ, вы можете задать свой вопрос и опубликовать его как ответ на этот вопрос.
 19 июн. 2012 г., 09:58
@MichaelKohl Хех, правда. Мне это нравится, в Ruby так много всего интересного :)
 19 июн. 2012 г., 09:03
Хорошо, "модуль - это такой же объект, как и любой другой". была своего рода точка моего ответа тоже. :-)

Ваш ответ на вопрос