From: "Dan0042 (Daniel DeLorme)" Date: 2022-02-22T19:49:39+00:00 Subject: [ruby-core:107720] [Ruby master Feature#18597] Strings need a named method like `dup` that doesn't duplicate if receiver is mutable Issue #18597 has been updated by Dan0042 (Daniel DeLorme). > `(+some_object.send(a_method)).tap { |value| value << "blah" }` > or > `some_object.send(a_method).+@.tap { |value| value << "blah" }` What is "some_object"? What is "a_method"? What is "blah"? None of these give any indication of what this code is trying to achieve, what is the context. The only thing this shows is the syntax. But we already know what syntax is being asked. The example has been simplified/abstracted to a point where it doesn't say anything. I haven't yet seen a concrete, compelling example either in this thread or the other one. I even tried searching in gems for code like `(+var` but found nothing. If I look at the example in the description, it seems obvious that if you're going to append text to a buffer, it's better ``` String#+@ was meant to be used with string literals in combination with `frozen_string_literal: true`, and I don't quite see what you're trying to (ab)use it for. ---------------------------------------- Feature #18597: Strings need a named method like `dup` that doesn't duplicate if receiver is mutable https://bugs.ruby-lang.org/issues/18597#change-96643 * Author: danh337 (Dan H) * Status: Open * Priority: Normal ---------------------------------------- This is related to #16295, but focuses only on the `.+@` part. Currently we can use `.dup` in a method chain when we need to mutate a String. However there are cases where the code's context *expects* the String to be mutated. In cases like this, `.dup` always works, but we don't want to duplicate a String that is already mutable. Since `.+@` looks more like an operator, it can be unintuitive in a method chain, so this is asking for a new named method that can be used in its place, instead of always `.dup`. For example: ``` def add_result_text(buffer, new_result) text = "#{new_result.count} #{new_result.input} #{do_fancy_calc(new_result)}\n" buffer.dup_if_immutable << text # ^^^^^^^^^^^^^^^^ new method? end buffer = "" # ...maybe immutable get_lots_of_results.each do |result| buffer = add_result_text(buffer, result) # In case it was dup'ed end ``` -- https://bugs.ruby-lang.org/ Unsubscribe: