String#[]
возвращает новую строку, , как задокументировано .
a = "foo"
a.object_id
# => 70217975553640
a[0].object_id
# => 70217957574840
Строка не состоит из символьных объектов, это отдельный объект (по крайней мере, на поверхностном уровне, я не уверен в C внутренностях). Таким образом, нет способа извлечь символ и при этом сохранить его принадлежность к исходной строке - вам нужно работать со строкой в целом, если вы хотите изменить его.
String#[]=
, с другой стороны, изменяет строку
Вы можете сделать свой метод так:
def test_problem(str)
str[3] = str[3].upcase # dont use bang methods when assigning
str
end