На Вторые мысли , вот лучший ответ:
def always_upcase_strings(&block)
anon_class = Class.new do
def puts(str)
super(str.upcase)
end
end
anon_class.new.instance_eval(&block)
end
always_upcase_strings do
puts "abc" #=> "ABC"
puts "def" #=> "DEF"
puts "ghi" #=> "GHI"
end
puts "xyz" #=> "xyz"
Этот создает временный класс (анонимный, потому что ему не нужно имя)с желаемым переопределением метода.
Затем вызывается полученный блок в контексте этого экземпляра класса .
А также менее запутанный, чем мой "redefine-undefine-redefine метод "решение", этот подход имеет дополнительное преимущество в том, что он потоко-безопасный .Таким образом, вы не получите странного поведения, если, например, будете выполнять параллельные тесты при вызове метода.
... Но я все еще придерживаюсь своего первоначального утверждения, что переопределение методов в блоке - это супер удивительное поведение.Сотрудникам, вероятно, не понравится, что вы выбрали этот шаблон проектирования (если он не выполнен ограниченным образом и по уважительной причине!)