Ruby元编程学习笔记(二)

有时候,我们可能要扩展已有的类,可以通过打开类(Open Class)和细化(Refinement)的方式。打开类是全局影响的,而细化的方式可以将影响控制在需要的地方。举例说明:

原始类定义: my.rb

class MyClass
  def my_method
    "original my_method()"
  end

  def another_method
    puts "call ( #{my_method} ) in another_method"
  end
end

打开类方式扩展: openmy.rb

require './my'

class MyClass
  def my_method
    "opened my_method()"
  end
end

细化方式扩展: refinemy.rb

require './my'

module MyClassRefinement
  refine MyClass do
    def my_method
      "refined my_method()"
    end
  end
end

测试打开类方式

test_openmy.rb

require './openmy'

obj = MyClass.new
puts obj.my_method        # opened my_method()
puts obj.another_method   # call ( opened my_method() ) in another_method

test_refinemy.rb

require './refinemy'

using MyClassRefinement

obj = MyClass.new
puts obj.my_method        # refined my_method()
puts obj.another_method   # call ( original my_method() ) in another_method

在绝大多数情况下,我们都应该使用细化的方式来扩展类。