Почему Matz принимал решение сделать Строки изменяемыми по умолчанию в Ruby?

Это - реверс этого вопроса: Почему строки не могут быть изменяемыми в Java и.NET?

Этот выбор был сделан в Ruby только потому, что операции (добавляет и такой) эффективны на изменяемых строках, или была ли некоторая другая причина?

(Если бы это - только эффективность, которая казалась бы странной, так как дизайн Ruby, кажется, иначе не помещает высокую премию на faciliating эффективное внедрение.)

43
задан Community 23 May 2017 в 12:01
поделиться

1 ответ

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

Ruby также имеет ряд разрушительных методов, таких как String#upcase! , которые полагаются на то, что строки могут быть изменяемыми.

Другая возможная причина в том, что Ruby вдохновлен Perl, а Perl, как оказалось, использует изменяемые строки.

В Ruby есть символы и замороженные строки, и те и другие неизменяемы. В качестве дополнительного бонуса, символы гарантированно уникальны для каждого возможного значения строки.

32
ответ дан 26 November 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: