Нет, все передается по ссылке в Ruby, и строки являются изменяемыми. Как вы уже упоминали, обычным делом является dup
строка в методе.
Однако гораздо более простой способ - просто не делать sentence[open..close]
, а вместо этого что-то вроде sentence[0...open] + sentence[(close + 1)..-1]
, которое создает новую строку для каждой итерации. Таким образом, вам не придется беспокоиться о мутировании строки. С другой стороны, это решение может создать гораздо больше строковых объектов, что снижает производительность, поскольку сборщик мусора должен выполнять гораздо больше работы, но это актуально только в том случае, если вы делаете это десятки тысяч раз.