Используете ли вы .dup
для строк, влияет ли модификация на месте (методы, заканчивающиеся на !
), на оригинальную строку.
В качестве небольшой глупой демонстрации ...
irb(main):009:0> def shout(s)
irb(main):010:1> local = s.dup
irb(main):011:1> local.upcase!
irb(main):012:1> puts local
irb(main):013:1> end
=> nil
irb(main):014:0> greeting = "hi"
=> "hi"
irb(main):015:0> shout(greeting)
HI
=> nil
irb(main):016:0> greeting
=> "hi"
Если вы запустите тот же фрагмент, изменив local = s.dup
на local = s
, тогда окончательное значение greeting
будет "HI"
, поскольку shout
изменит greeting
..dup
возвращает копию оригинальной строки, предотвращая изменения оригинала.