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
悪くはありません。
— 絞り込みはクラス メソッドをサポートしません。ああ。もちろん、それらはハックによるものです (覚えておいてください、すべてがオブジェクトです)。
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
はキーワードではありません。ああ。(まあ、「バー!」再び。)
それで、私の質問は次のとおりです。私はスマートを逃していますか、それとも新しく導入された機能に誰も利点がないと考えていますか?