Ruby 2.0 Refinements: Totally Useless Crap
There were so-called refinements introduced in Ruby 2.0. I was playing with them and now I’m totally cajoled. Let me explain, what’s wrong with ’em and why I consider nobody actually wants to use them.
The main declared advantage of refines is that they are not global scoped. Bah.
module MyModule
  class ::String
    def my_locally_needed_func
      # do smth 
    end
  end
end
# here I need it
require 'mymodule'
"".my_locally_needed_func
is isolated not worse.
Refinements do not support class methods. Bah.
Of course they do through a hack (remember, everything is an object:)
module VoidRefinements
  refine String do
    def self.singleton_method_for_string_class
      puts "inside singleton_method_for_string_class"
    end 
  end 
end
module VoidRefinementsOK
  refine Class do
    def singleton_method_for_string_class
      err_msg = "NoMethodError: undefined method" + \
                "‘#{__method__}’ for ‘#{self}:#{self.class}’"
      raise NoMethodError.new(err_msg) unless String == self
      puts "inside proper singleton_method_for_string_class"
    end 
  end 
end
using VoidRefinements
String.singleton_method_for_string_class rescue puts $!
# ⇒ undefined method `singleton_method_for_string_class' for String:Class
using VoidRefinementsOK
String.singleton_method_for_string_class rescue puts $!
# ⇒ inside proper singleton_method_for_string_class
The latter is not even resulting in performance penalties, since nobody would call Fixnum.substr on purpose.
Refinements are executed through eval.
refine is not a keyword. Bah. (well, “bah!” again.)
Plus I have had some weird unpredicted errors with non-ascii method names in refinements. But that does actually make already no sense after all.
Am I missing smth or everyone sees no advantages in the newly introduced feature?