From: "Dan0042 (Daniel DeLorme)" Date: 2022-02-21T23:48:37+00:00 Subject: [ruby-core:107704] [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). As I'm sure you realize, after the loop the buffer would still be empty; text is concatenated to a dup'ed buffer that is then thrown away. What's the point of that? You'd need to use `buffer = add_result_text(buffer, result)` in the loop, but at that point it would be simpler to just have a mutable buffer to start with: `buffer = +""`. And chaining doesn't even pose a precedence problem; if you use `+buffer << text` it's perfectly readable. So I find this example very unconvincing. ---------------------------------------- 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-96622 * 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| add_result_text(buffer, result) end ``` -- https://bugs.ruby-lang.org/ Unsubscribe: