Ruby2.0: What is the difference between Ruby Refinements and Monkeypatches?

64 Views Asked by At

I could do some simple task in either way,

Refinements

module StringRefinements
  refine String do
    def do_something
      "bla bla bla..."
    end
  end
end

So, I can use do_something method wherever StringRefinements module was using.

Monkeypatch

class String
  def do_something
    "bla bla bla..."
  end
end

I would like to know the difference between Ruby's new concept Refinements and the one Monkeypatch. And what are the advantages of using Refinements over Monkeypatch?

1

There are 1 best solutions below

0
On

The most significant different between refinements and monkey-patching is that monkey-patching changes every single instance in your application. This might not be a problem when you are adding a method that doesn't otherwise exist, but when you are redefining an existing method, it can very easily break expectations elsewhere in the code.

When you use refinements, the behaviour is only changed where you use the using method to activate the refinements. This is safer because your changed methods cannot "leak" into the rest of your code (or dependencies).