Обезьянье исправление внутри модуля, чтобы ограничить его объем

Почему это вызывает ошибку, когда класс и оператор инкапсулированы в модуль?

module Xchange

  class Float

    def in currency
      self.to_s << " " << suffix(currency)
    end

    private

    def suffix currency
      case currency
      when :euro
        "euros"
      when :dollar
        "dollars"
      when :rupee
        "rupees"
      end
    end

  end

  puts 2.3.in(:euro)
end

person Jikku Jose    schedule 11.04.2014    source источник
comment
Какую версию Руби вы используете?   -  person Severin    schedule 11.04.2014


Ответы (3)


Если вы используете текущую версию Ruby, я бы посоветовал вам отказаться от обезьяньих исправлений и начать использовать уточнения (http://www.ruby-doc.org/core-2.1.1/doc/syntax/уточнения_rdoc.html). Таким образом, вы можете вводить "обезьяньи патчи" для определенных модулей гораздо удобнее и роднее для Ruby.

person Severin    schedule 11.04.2014
comment
Что ж, не ограничит ли это драгоценный камень текущей версией Ruby? Почему-то чувствую, что это ограничивает; хотя не видел никаких реальных данных, чтобы решить. - person Jikku Jose; 11.04.2014

Упс, моя ошибка! Мне потребовалось время, чтобы понять! Только что попробовал заглянуть внутрь класса Float с помощью Pry и к своему удивлению обнаружил, что в нем нет других методов Float. Итак, я предполагаю, что Float, который я пытался переопределить, не был глобально доступным Float. Это новый класс под названием Xchange::Float с единственным методом экземпляра in!

Итак, вкратце я считаю, что такой патч будет глобальным и для всех файлов, которые requires его. Отсюда пункт refine в новой версии.

person Jikku Jose    schedule 11.04.2014

Это потому, что вы объявили новый класс Xchange::Float вместо открытия существующего класса Float.

person BroiSatse    schedule 11.04.2014
comment
Да, я хотел ограничить объем изменений в Float только внутри модуля Xchange. - person Jikku Jose; 11.04.2014
comment
Вы не можете этого сделать. Это будет означать, что вы хотите, чтобы определенные объекты вели себя по-разному в другом контексте. - person BroiSatse; 11.04.2014