This causes a bunch of unnecessary string allocations in the following scenario: "#{'rails' unless boolean_condition} is great". Each time this line is called when boolean_condition is true, it evaluates to nil and when nil is interpolated into a string it allocates an empty string. Ideally, the behavior of nil.to_s would reference a frozen empty string that wouldn't need to be reallocated each time.
I'm confused; are you proposing that nil.to_s returns the same String object every time, or that string interpolation detects a nil object and optimises it?
A lot of times I rely on "#{foo}" returning a new String object that contains a copy of the #to_s of foo, so it seems to me like spec that "#{nil}" returns a new empty string every time.
Closer to the string interpolation optimization part. The problem with "#{nil}" is that it allocates two empty strings each time. I feel like it would be possible to do this with zero/one allocation. I don't know what the underlying code looks like, but the logic I'm thinking of is something like
definterpolate(obj)ifobj==nil''elseobj.to_s# assuming this is current behaviorendend
phluid61 (Matthew Kerwin) wrote:
I'm confused; are you proposing that nil.to_s returns the same String object every time, or that string interpolation detects a nil object and optimises it?
A lot of times I rely on "#{foo}" returning a new String object that contains a copy of the #to_s of foo, so it seems to me like spec that "#{nil}" returns a new empty string every time.