El método 'tap' en el objeto String no devuelve el resultado esperado

Me encontré con un problema interesante al usar el método 'tap' en objetos de tipo 'String'.

"abc".tap { |o| o = "xyz" } # this line returns "abc" instead of "xyz"

El método 'tap' funciona en objetos de otros tipos.

[].tap { |o| o << "xyz" } # this line returns ["xyz"] as expected

Estoy usando Rails 2.3.2 y Ruby 1.8.6 en Windows XP.

¿Que me estoy perdiendo aqui?

Actualización 1: resolví este problema. Fue un error de uso de mi parte. En el primer escenario, estaba reasignando el valor al parámetro de bloque en lugar de modificarlo. Pude reescribir el código y obtener el resultado esperado.

"abc".tap { |o| o.replace "xyz" }

Actualización 2: El código utilizado aquí es solo para demostrar el problema. Mi código actual no se ve así.

Respuestas a la pregunta(1)

Su respuesta a la pregunta