Bug #10795
closedto_s returns references to self if called on string
Description
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