Cайт веб-разработчика, программиста Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Первоуральск

Админка на Ruby on Rails

Ruby 2: Module#refine

Дословно "усовершенствования, совершенствовать". Метод, позволяющий обезопасить использование "monkey patching". Разработчикам Ruby известно, что метод "monkey patching" позволяет добавлять (изменять) любую функциональность к существующим (и что наиболее опасно - "базовым", "основным") классам Ruby - великая мощь этого механизма так же требует большой ответственности. "Усовершенствования" позволяют изолировать использование метода "monkey patching" в каком-то определенном файле. В последний момент перед выпуском Ruby 2.0.0 метод using был изменен таким образом, что его использование возможно только в глобальной области видимости, в области одного файла.

Важно помнить, что это эксперементальный механизм, который может быть изменен в следующих реализациях Ruby - warning: Refinements are experimental, and the behavior may change in future versions of Ruby!.

Пример:

module Ref

  refine String do

    def hello

      puts "#{self} says : Hello, world"

    end

  end

end

String.new('Test').hello #=> undefined method 'hello' for "Test":String (NoMethodError)

using Ref

String.new('Test2').hello #=> Test2 says : Hello, world

class A

  using Ref #=> undefined method 'using' for A:Class (NoMethodError)

end