From: dwelch@... Date: 2018-03-27T04:17:13+00:00 Subject: [ruby-core:86320] [Ruby trunk Bug#14624] #{nil} allocates a fresh empty string each time Issue #14624 has been updated by bumblingbear (Dillon Welch). 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 ``` def interpolate(obj) if obj == nil '' else obj.to_s # assuming this is current behavior end end ``` 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. ---------------------------------------- Bug #14624: #{nil} allocates a fresh empty string each time https://bugs.ruby-lang.org/issues/14624#change-71239 * Author: bumblingbear (Dillon Welch) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- 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. -- https://bugs.ruby-lang.org/ Unsubscribe: