Ruby の private メソッドを特定のコンテキストで public にする

Ruby では次のように private メソッドにすると『レシーバをつけたメソッド呼び出し』ができません。

class X
  private

  def value
    42
  end
end

x = X.new

# error: private method `value' called for #<X:0x00007fabe905fa40> (NoMethodError)
x.value

こういうときに refinements を使うと任意のコンテキストでのみ public 化することができます。

class X
  private

  def value
    42
  end
end

x = X.new
# error
# x.value

# refinements を使って public 化する
using Module.new {
  refine X do
    public :value
  end
}

# OK
x.value

べんり。