Понимание добавления строки в Ruby - PullRequest
0 голосов
/ 23 мая 2018

У меня был следующий код:

uri = organization_host_url
uri << 'email_check'
target_uri = URI(uri)

Когда эта часть кода вызывалась повторно, uri сохранял старое значение и добавлял новую добавляемую часть.С другой стороны, когда я вызывал его один, он не сохранял старое значение.

Я изменил код на:

uri = organization_host_url + 'email_check'
target_uri = URI(uri) 

и теперь uri не сохраняет старое значениезначение при неоднократном вызове.

Почему при использовании опции добавления uri содержит старое значение?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Это установка uri для того же объекта , что и в organization_host_url

uri = organization_host_url

Это мутирование того же объекта.

uri << 'email_check'

Если вы проверите сейчас, вы увидите, что и uri, и organization_host_url содержат измененный строковый объект.

Когда вы делаете

uri = organization_host_url + 'email_check'

uri, теперь содержится отличается строковый объект от organization_host_uri

Вы можете проверить это, проверив uri.object_id и organization_host_uri.object_id в первом примере, вы увидите, что они имеют одинаковый идентификатор объекта.

0 голосов
/ 23 мая 2018

Добавление к строке с помощью << приведет к изменению объекта-получателя, тогда как использование + не приведет к изменению.Пример:

# Mutating
string1 = 'foo'
string1 << ' bar'
puts string1
# => "foo bar"

# Non-mutating
string2 = string1 + ' baz'
puts string2
# => "foo bar baz"
puts string1
# => "foo bar"

В вашем случае, каждый раз, когда запускается логика добавления URI, он добавляет строку непосредственно к исходному объекту, поэтому вы испытываете нежелательное сцепление этого email_checkподстрока при последующих запусках.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...