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