There were so-called refinements introduced in Ruby 2.0. I was playing with them and now I’m totally cajoled:
— The main declared advantage of refine
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 are 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 $!
using VoidRefinementsOK
String.singleton_method_for_string_class rescue puts $!
# undefined method `singleton_method_for_string_class' for String:Class
# 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.)
So, my question is: am I missing smth or everybody sees no advantages in the newly introduced feature?
refine
. – Daphenerequire
are not as well) precisely show, that actually the question stated in the proper manner. Sorry. – Daphene