Project

General

Profile

Actions

Feature #18597

open

Strings need a named method like `dup` that doesn't duplicate if receiver is mutable

Added by danh337 (Dan H) almost 3 years ago. Updated almost 2 years ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:107699]

Description

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

Files

driver.rb (12.3 KB) driver.rb Show patterns for named method danh337 (Dan H), 02/26/2022 11:20 PM
driver.rb (12.7 KB) driver.rb More fair code for timing checks danh337 (Dan H), 02/26/2022 11:54 PM

Related issues 1 (0 open1 closed)

Related to Ruby master - Feature #16295: Chainable aliases for String#-@ and String#+@ClosedActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like1Like0