From: ruby-core@... Date: 2015-01-29T15:58:38+00:00 Subject: [ruby-core:67887] [ruby-trunk - Bug #10795] to_s returns references to self if called on string Issue #10795 has been updated by Marc-Andre Lafortune. Francesco Boffa wrote: > I insist, however, that this should at least be made clearer in the documentation of all the `to_s` methods available in the standard library. Not sure what you mean by "all" `to_s` methods. Only `String#to_s` returns the receiver. The document is quite explicit, both in the interface and the description. OTOH, it didn't mention the effect for subclasses, so I modified it to follow that of `Array#to_a`. ---------------------------------------- Bug #10795: to_s returns references to self if called on string https://bugs.ruby-lang.org/issues/10795#change-51288 * Author: Francesco Boffa * Status: Rejected * Priority: Low * Assignee: * ruby -v: ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin13.0] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- This is not actually a bug, but rather a strong violation of the Principle of least astonishment. Lately I found a bug in the Rails project I work to. There was a method concatenating two float values with a comma, converting them to string like this: ~~~ def coords_to_string latitude.to_s << "," << longitude.to_s end ~~~ The bug happened when we passed latitude and longitude as strings instead of floats. Actually, `5.12345.to_s` returns a new string object and any operation made on that string wont affect the original 5.12345. Instead `"5.12345".to_s` will return the same instance of that string, so that the `<<` method will affect the original string. So we found that our latitude variable was growing on each call and after a while it become "5.12345,13.12345,13.12345,13.12345,13.12345,13.12345" This was probably made like this for performance reasons, however we found it a clear violation of the POLA, whereas we expected to_s to always return a new instance of that string. Hope, this may help. Francesco Boffa -- https://bugs.ruby-lang.org/