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