組み込みメソッドを再定義してみるテスト
やってはいけないとわかっていつつも。
さっそく導入されたばかりのinstance_execを使ってみた。
class Module def redefine_method(meth, &block) old = instance_method meth remove_method meth define_method(meth) do |*args, &methblock| new = old.bind(self) instance_exec(new, args, methblock, &block) end end end class String redefine_method(:length) do |orig, *| orig.call + 1 end redefine_method(:each_char) do |orig, _, block| orig.call{|c| block["<#{c}>"] } end end "hoge".length # => 5 String.new("hao").length # => 4 "ha".each_char{|x| p x} # >> "<h>" # >> "<a>"