Базовое метапрограммирование: расширение существующего класса с помощью модуля?

Я бы хотел, чтобы часть моего модуля расширила класс String.

Это не работает

module MyModule
  class String
    def exclaim
      self << "!!!!!"
    end
  end
end

include MyModule

string = "this is a string"
string.exclaim

#=> NoMethodError 

Но это работает

module MyModule
  def exclaim
    self << "!!!!!"
  end
end

class String
  include MyModule
end

string = "this is a string"
string.exclaim

#=> "this is a string!!!!!"

Я не хочу, чтобы все другие функции MyModule должны быть оставлены в String. Включение его снова на самом высоком уровне кажется некрасивым. Разве есть более изящный способ сделать это?

8
задан djb 30 August 2011 в 11:22
поделиться