Issue #14478 has been updated by ko1 (Koichi Sasada). Summary of this issue: # Background We changed to return dedup-ed string with `String-@`. https://bugs.ruby-lang.org/issues/13077#note-7 > For the time being, let us make -@ to call rb_fstring. # Issue However, it returns non-deduped string when `self` is frozen because of `OBJ_FREEZE(str)` check (https://bugs.ruby-lang.org/issues/14478#note-5). It is inconsistent. We can't use it for `dedup` functionality. # Proposal We always need to return dedup-ed strings with `String#-@` ---- This proposal makes sense for me, at least I understand "inconsistency". ---------------------------------------- Feature #14478: String #uminus should de-dupe unconditionally https://bugs.ruby-lang.org/issues/14478#change-70372 * Author: sam.saffron (Sam Saffron) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- continuing: https://bugs.ruby-lang.org/issues/14475 Current documentation for String uminus says: "If the string is frozen, then return the string itself." Trouble is that there is no simple way to de-duplicate unconditionally without inefficiency: Say `x` is an arbitrary string (either frozen or unfrozen) : ``` x = -x # may return a non fstring x = -+x # will return fstring, but makes an unneeded copy x = -x.dup # fstring again, uneeded copy x = x.frozen? ? -+x : -x # too verbose, uneeded copy ``` Instead why not change it so `-` is deduped unconditionally? I would argue this is worth backporting, cause if we are making fstring optimisations now, we are going to be stuck with legacy inefficient code going forward. An alternative may be a c-extension gem that adds #fstring to String but that just feel wrong. I think the documentation should say: String uminus says: "If the string is de-duplicated, then return the string itself." Happy to make the change it is quite simple:`(FL_TEST(str, RSTRING_FSTR)` -- https://bugs.ruby-lang.org/ Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>