Ruby 2.0 中引入了所谓的改进。我和他们一起玩,现在我完全被哄骗了:
— 声明的主要优点refine
是它们不是全局范围的。呸。
module MyModule
class ::String
def my_locally_needed_func
# do smth
end
end
end
# here I need it
require 'mymodule'
"".my_locally_needed_func
是孤立的,不是更糟。
— 改进不支持类方法。呸。当然,它们是通过 hack(记住,一切都是对象):
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
后者甚至不会导致性能损失,因为没有人会Fixnum.substr
故意调用。
— 细化是通过 执行的eval
。refine
不是关键字。呸。(嗯,“呸!”再次。)
所以,我的问题是:我是否错过了什么或者每个人都认为新引入的功能没有优势?