Почему символ в строке не видоизменен? - PullRequest
0 голосов
/ 29 июня 2018
def test_problem(str)
  str[3].upcase! # str[3] = str[3].upcase! works
  str
end

p test_problem("hello")

Мой вопрос, почему String.upcase! метод мутации не изменяет строку в приведенном выше случае, но вам нужно переназначить этот символ в строке?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Это действительно изменяет строку. Но вы игнорируете это и никогда не смотрите на это. Поэтому вы не можете знать, мутировал ли он или нет.

0 голосов
/ 29 июня 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...