組み込みメソッドを再定義してみるテスト

やってはいけないとわかっていつつも。

さっそく導入されたばかりの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>"