Это - реверс этого вопроса: Почему строки не могут быть изменяемыми в Java и.NET?
Этот выбор был сделан в Ruby только потому, что операции (добавляет и такой) эффективны на изменяемых строках, или была ли некоторая другая причина?
(Если бы это - только эффективность, которая казалась бы странной, так как дизайн Ruby, кажется, иначе не помещает высокую премию на faciliating эффективное внедрение.)
Это соответствует дизайну Ruby, как вы заметили. Неизменяемые строки более эффективны, чем изменяемые - меньше копирования, так как строки используются повторно - но усложняют работу программиста. Интуитивно понятно, что строки можно воспринимать как изменяемые - их можно объединять. Чтобы справиться с этим, Java молча переводит конкатенацию (через +
) двух строк в использование объекта StringBuffer, и я уверен, что есть и другие подобные хаки. Вместо этого Ruby предпочитает сделать строки по умолчанию изменяемыми в ущерб производительности.
Ruby также имеет ряд разрушительных методов, таких как String#upcase!
, которые полагаются на то, что строки могут быть изменяемыми.
Другая возможная причина в том, что Ruby вдохновлен Perl, а Perl, как оказалось, использует изменяемые строки.
В Ruby есть символы и замороженные строки, и те и другие неизменяемы. В качестве дополнительного бонуса, символы гарантированно уникальны для каждого возможного значения строки.