Изменчивость Ruby-строки - PullRequest
9 голосов
/ 23 января 2009

Это может быть немного странным вопросом, я недавно пытался стать лучше на ruby ​​и начал читать фантастический Язык программирования Ruby . Кое-что, что было упомянуто, - то, что строковые литералы считаются изменяемыми, поэтому в цикле лучше использовать переменную, чем литерал, поскольку новая строка будет создаваться на каждой итерации.

Мой вопрос - почему? Сначала я думал, что это из-за интерполяции, но символы являются неизменными, и они поддерживают интерполяцию. Исходя из статического фона, для меня это не имеет особого смысла.

EDIT:

После прочтения thenduks ответа, я думаю, что он может быть. AFAIK, языки как Java или C # не имеют разрушающих строковых методов (они используют верхний регистр, но не верхний регистр!). Из-за таких вещей, как upcase! или <<, литерал не может быть неизменным. </p>

Не уверен на 100%, другая возможность состоит в том, что происходит интернирование во время компиляции, чего просто не происходит в скриптовом языке.

1 Ответ

7 голосов
/ 23 января 2009

Не совсем уверен, что именно ваш вопрос, но рассмотрим следующий код:

10.times { puts "abc".object_id }

Это распечатывает 10 разных идентификаторов. Зачем? То, что вы знаете, что эта строка не изменится, не означает, что это делает Ruby. Если вы думаете, что "abc" должен быть создан только один раз, то что произойдет, если вы сделаете:

10.times { puts "abc".upcase! }

Метод upcase! изменяет строку на верхний регистр, на следующей итерации строка, созданная на первой итерации, больше не совпадает.

Возможно, опубликуете пример кода, который вас смущает?

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