> Ну мне вот тоже непонятно, зачем этот to_string() - о константе компилятор
> знает абсолютно всё, намерение программиста также абсолютно прозрачно - зачем этот
> мусор?Во-первых, не прозрачно. s имеет тип auto, и если не использовать to_string(), то туда будет положен именно слайс, статический и immutable. То есть, как минимум, придётся явно указывать тип для s. Во-вторых, неявные преобразования типов -- это ни-ни. В этом отношении раст даже немного вымораживает, нужно явно указывать преобразования, например, из single-float в double-float. Но в случае со строками я не вижу большой беды. Метод to_string создаёт новый объект, он выделяет память из кучи и копирует туда содержимое слайса. Идея сделать это неявным мне, честно говоря, не нравится нисколько.
> push_str - там более маразм какой-то. От джавы нахватались, что
> ли? Нет, чтобы оператор конкатенации сделать.
Можно и при помощи оператора:
s += ", world";
> Не, привыкнуть ко всем можно - но зачем делать заведомо неудобные конструкции?
> Отдельно реализованные строки и слайсы - это вообще какая-то совершенно непонятная
> избыточность.
Слайс -- это не строка, это что-то типа сишного массива, они фиксированного размера. &str -- это, грубо говоря, чисто синтаксическая обёртка вокруг &[u8] (указатель на массив из u8, unsigned char'ов, длина которого неизвестна в compile-time). И эта синтаксическая обёртка по-сути нужна только потому, что &str состоит из элементов переменного размера. &str даёт грядку методов для разруливания этого. Если бы rust использовал бы константного размера символы, то никто бы даже не заморочился бы создавать &char, все бы использовали непосредственно &[u8], &[u16] или &[u32], в зависимости от конкретного выбранного кодирования символов.
String же -- это обёртка над указателем на str, который располагается в куче. String заведует lifetime'ом этого str, динамически выделяет/перевыделяет/освобождает память.
Вся эта ситуация, на самом деле, напоминает C++, где есть char[], и есть std::string.