Иммутабельные структуры данных упрощают программирование: если ты принял строку в качестве параметра, ты можешь сохранить её указатель. Если же строка мутабельная, ты должен её скопировать, иначе у тебя нет контроля над тем, чтобы её никто не менял. Ну и многопоточность. Мутабельные строки обычно тоже есть, но по понятным причинам пользуются меньшей популярностью.
Ну вообще говоря UTF-8 никак не мешает этому. Просто в отдельных случаях будет реаллокация байтов. Но во многих случаях, скорее всего, будет in-place замена, т.к. чаще всего меняют символы той же длины или in-place замена + перемещение хвоста строки. Более того, можно даже хвост не перемещать, если забить неиспользуемые байты какими-нибудь специальными значениями. Т.е. реаллокация будет тогда и только тогда, когда мы заменяем, например, латинскую букву русской.
Но этого же никто не гарантирует, а если длина поменялась, то нужно реалокацию делать со всеми вытекающими.
Да и для любителей менять символы есть byte array, просто в сишечке так сложилось, что и byte array и строки имеют один и тот же тип char*, хотя суть у них ну совсем разная. С тех пор и тянется.
константа это code point. А осмысленные символы могут состоять из более чем одного code point-а. Например эмодзи «нубийская принцесса» может состоять из всмопогательного code point-а, обозначающего чёрный цвет и эмодзи «принцесса». Если ты заменишь принцессу на букву «A», получится чушь: менять нужно оба code point-а.
Это очень вырожденный пример, и все равно можно посмотреть, не идет ли диакритика после символа, и это все равно асимптотически ~константа (плевать на залго). А перед этим еще и NFC прогнать.
Иммутабельные структуры данных упрощают программирование: если ты принял строку в качестве параметра, ты можешь сохранить её указатель. Если же строка мутабельная, ты должен её скопировать, иначе у тебя нет контроля над тем, чтобы её никто не менял.
Это касается вообще любого объекта, не только строки.
Мутабельные строки обычно тоже есть,
Есть, но далеко не везде, а только в Ъ-ООП, в основном, где все есть объект.
но по понятным причинам пользуются меньшей популярностью.
Причины эти понятны, да, урезание выразительных возможностей языка в угоду перформанса, это обычное дело
Это касается вообще любого объекта, не только строки.
Строка это встроенная структура данных. За отдельные объекты отвечают уже их создатели.
Мутабельные строки обычно тоже есть,
Есть, но далеко не везде, а только в Ъ-ООП, в основном, где все есть объект.
Я не сталкивался с языками, в которых их нет. Разве что JavaScript приходит на ум. Есть ещё примеры?
но по понятным причинам пользуются меньшей популярностью.
Причины эти понятны, да, урезание выразительных возможностей языка в угоду перформанса, это обычное дело
Совсем наоборот. Иммутабельные строки не дают никакого прироста перформанса. Дело в другом — иммутабельные строки позволяют писать более понятный и надёжный код.
В тру любая структура данных — полноценный объект.
Я не сталкивался с языками, в которых их нет. Разве что JavaScript приходит на ум. Есть ещё примеры?
пистон тот же, большинство языков. Да и в джаве твоей это тоже фейк, насколько я понимаю. Там строки — это не настоящие объекты, в том числе и эти ваши билдеры, просто клоунада.
Совсем наоборот.
Ну, значит ты имеешь свое собственное мнение(TM) отличное от мнения экспертов. Молодец.
значит. Насколько я понимаю, в питоне строки такие же примитивы, с какими-то там ньюансами, это сути не меняет. Примерно то же самое, что и в JS по большому счету.
Насколько я понял, он говорит о том, что для ООП смысл слова «присваивание» вообще теряется, по большому счету. Когда мы пишем foo=bar, это с точки зрения ООП означает «отправить объекту global сообщение setSlot с адресом такого то объекта» дальше, объект global получив сообщение, связывает (если посчитает нужным) в своем адресном пространстве идентификатор «foo» c расположением данного объекта.
Нет, там было бы абсолютно все объектами, если бы там отработал псевдокод, который я привел выше. А это не так. В питоне, кстати, судя по синтаксису, который я обычно вижу, синтаксических костылей еще побольше чем в JS будет.
И, если уж рассуждать глобально, ни в питоне не в JS вообще нет полноценных объектов. Семантика сообщений предполагает, что объект сам решает, что делать с сообщением. Следовательно, должны быть ленивые вычисления искаропки. Например, ты можешь средствами языка реализовать кастомный if-then-else. Ни в пистоне ни в js этого нет(не считая костыли на проксях), так что не надо тут про «полноценность» заливать.
Кстати в ruby удобству отдаётся предпочтение перед ООП, например, тот же yield. Так как изначально создавался для простых работяг программистов, а не школьников, надрачивающих на трушность решений.
любой объект волен выполнять или не выполнять энергично аргументы, аргументы являются частью сообщения. Это круче, чем лисповские макросы, так как методы остаются first-class и живут в рантайме.
В JS и пистоне аргументы всегда выполняются, объект не имеет над ними контроля. А это не отвечает требованию о том, что объект сам волен решать, как ему поступать с пришедшим сообщением.
Он не только в муттабельность, он и в наследование не умеет. Чем он тогда вообще отличается от примитива?
В наследование вполне умеет. Более того — сам тип str обладает классом-родителем.
В JS и пистоне аргументы всегда выполняются, объект не имеет над ними контроля. А это не отвечает требованию о том, что объект сам волен решать, как ему поступать с пришедшим сообщением.
Эмм. Это вопрос синтаксиса и макросов. Объекту приходит уже результат.
Тут ты выполняешь эту фигню. Хочешь отправить объекту — отправляй что-нибудь вроде (write, 1), (write, 2) чтобы он сам их и запускал. Ты откроешь... функции как объекты первого класса в противоположность к макросам.
любой объект волен выполнять или не выполнять энергично аргументы, аргументы являются частью сообщения. Это круче, чем лисповские макросы, так как методы остаются first-class и живут в рантайме
это обычные лисповские фекспры. которые стали не модными.
любой объект волен выполнять или не выполнять энергично аргументы, аргументы являются частью сообщения.
Так и в любом интерпретаторе с евалом все точно так же. В твоем примере просто разработчики языка запретили передавать сообщением что-либо кроме строки, а в нормальных языках - можно передавать любой объект вообще.
В JS и пистоне (в которых первоклассные функции) аргументы всегда выполняются, объект не имеет над ними контроля. А это не отвечает требованию о том, что объект сам волен решать, как ему поступать с пришедшим сообщением.