> Взять к примеру PathBuf:
> fn make_directories(prefix: &str) -> Result<(), io::Error>
> let mut pathbuf = PathBuf::new();
> pathbuf.push(prefix);
> pathbuf.push("bin");
> // работаем с путём $prefix/bin
> pathbuf.pop();
> pathbuf.push("share");
> // теперь с путём $prefix/share
> } Вот это хороший пример.
> Это не функционально от слова совсем. Но зато не надо под каждый
> путь выделять свежий кусок памяти из кучи.
Это можно очень похоже написать на языке OCaml, который несомненно функциональный.
Если не вдаваться в дебри функций как first-class citizen, которые мало кому (включая меня) понятны, то:
1. признак императивности - наличие оператора, который даёт команду "верни результат". В Си это return.
2. признак функциональности - отсутствие такого оператора, как в функции с урока математики f(x) = 5x (и это понятнее людям без профдеформации).
Насколько я вижу, у приведённой функции есть результат, таким образом этот код функциональный, но функция с побочным эффектом.
> И на фоне этого, раст можно называть функциональным, с императивными элементами, или
> императивным с функциональными элементами... Как угодно, но эти названия ничего не
> значат.
Это в теории. На практике кто-то привык писать на императивном языке, ему говорят: "посмотри, вот замена, будет меньше ошибок". Человек смотрит, увиденное в шаблон не укладывается и возникает реакция "да нафик мне эти проверки от переполнения буфера". При этом например мне понятно, что чистые функции позволяют избежать более серьёзных проблем.
> Они бессмысленны совершенно, они свидетельствуют лишь о том, что развитие
> языков выросло из детских штанишек классификаций языков, а взрослую классификацию ещё
> не сшили.
По-моему классификация по признаку "более лучший Х" это вообще уровень пелёнок, скатывающий обсуждения к срачам и синтаксису.