Ничто не модифицируя замороженный String
Вы переназначения a
к новому String
с
a += "this string"
, который внутренне же в Рубине, как
a = a + "this string"
При добавлении два объекта String в Ruby, он создаст новую строку, содержащую результат (это нормальное поведение для +
на большинстве объектов, которые его поддерживают). Это оставляет неизменным исходные значения «Test» и «this string». Исходная, замороженная строка (содержащая «Тест») останется в памяти до тех пор, пока не будет собран мусор. Его можно собрать, потому что вы потеряли все ссылки на него.
Если вы пытались изменить объект на месте, как это:
a << "this string"
, то вы должны увидеть сообщение об ошибке RuntimeError: can't modify frozen String
В принципе, вы спутали a
, локальную переменную с String
объекта к которому он указывает. Локальные переменные могут быть повторно назначены в любое время независимо от объектов, хранящихся в Ruby. Вы можете проверить, что это произошло в вашем случае, проверив a.object_id
до и после вашей линии a +=
....
Возможный дубликат [Выемка переменных в Ruby, не работает] (http://stackoverflow.com/questions/17067171/freezing-variables-in-ruby- doesnt-work) – Manishh
Переменные различаются; поэтому они называются переменными. –
Я вижу, что это дубликат, но это хороший вопрос с хорошим ответом, из-за чего я неохотно использую на нем дуб-молот. Я предпочел бы отметить [номинированный экзамен] (http://stackoverflow.com/questions/17067171/freezing-variables-in-ruby-doesnt-work) как дубликат этого вопроса, хотя он старше - это не так чисто. –