Ruby2.0のRefinementsを試す。


http://el.jibun.atmarkit.co.jp/rails/2012/11/ruby-20-8256.html

Ruby2.0 のRefinementsなる機能を試す。
"クラス拡張の影響範囲を名前空間に限定する" とか。

test_refinements.rb

#!/usr/bin/env ruby
# coding:utf-8

module Hoge
  module Refinements
    refine String do 
      def say; "My name is #{self.capitalize}!!"; end
    end

    refine Integer do
      def say; "#{self} years old!!"; end
    end
  end

  class Foo
    using Refinements

    def initialize(name, age)
      @name = name
      @age = age
    end

    def say_name
      name.say
    end

    def say_age
      age.say
    end

    attr_accessor :name, :age
  end
end

foo = Hoge::Foo.new "hogetaro", 15
puts foo.say_name
puts foo.say_age

if String::instance_methods.include? :say
  puts "> String class has :say"
else
  puts "> String class has not :say"
end
$ ruby -v
ruby 2.0.0dev (2012-11-01 trunk 37411) [x86_64-darwin11.3.0]

$ ruby test_refine.rb 
My name is Hogetaro!!
15 years old!!
> String class has not :say

なるほど。