title: Why can't I change the output of puts "string" by over-riding .to_s or initialize on String?
body: <p>I've replaced a method to_s inside of String class,
  but as I can see, when I run <code>puts "string"</code>, ruby calls not the to_s method.</p>
  
  <pre><code>def add_method(cls)
    cls.class_eval do
      def initialize
        self.new('you hacked')
      end
  
      def to_s
        'you hacked'
      end
    end
  end
  
  add_method String
  
  puts "zxzxzzx"
  puts "zxzxzzx".to_s
  </code></pre>
  
  <p>which outputs:</p>
  
  <pre><code>&gt;&gt; zxzxzzx
  &gt;&gt; you hacked
  </code></pre>
  
  <p>How to replace this implicit initialization ?</p>