RubyのRefinementでモジュールincludeやalias定義はどうなるか

確認してみた結果、refineincludeしたモジュールのメソッドや定義したエイリアスは、refinementをusingしたときだけ有効になった。

refineincludeしたモジュールはusingしても見えないがメソッドは有効になるようだ。

確認コード:

module IncludeMethod
  def include_method
    :include
  end
end

module RefineMethod
  refine Object do
    include IncludeMethod

    def refine_method
      :refine
    end

    alias refine_method_alias refine_method
  end
end

p Object.include? IncludeMethod

begin
  refine_method
rescue
  p $!
end

begin
  refine_method_alias
rescue
  p $!
end

begin
  include_method
rescue
  p $!
end

using RefineMethod

p Object.include? IncludeMethod
p refine_method
p refine_method_alias
p include_method

確認結果:

$ ruby ex_refine.rb
false
#<NameError: undefined local variable or method `refine_method' for main:Object
Did you mean?  define_method>
#<NameError: undefined local variable or method `refine_method_alias' for main:Object
Did you mean?  define_method>
#<NameError: undefined local variable or method `include_method' for main:Object>
false
:refine
:refine
:include