По сути специально для итераторов добавили auto (хотя оно еще в generic lambdas в тему получилось). А тут ты еще намешал вложенные контейнеры, да еще и в шаблоне. Так можно и в расте нагородить. И да - если мне сообщат, что container оказывается:
Да ты и про руби так говорил. Анонимус помнит. Хотя руби очень легко читаемый, можно распарсить даже ниндзя-код. Тебе наверно и тикль, и лисп будут птичьими. Мозги уже закостенели что-ли на пыхпыхе и бейси^Wпитоне?
Не взлетают чаще красивые и изящные решения. Уродцы торжествуют чаще.
Ну да, практика показывает, что чаще взлетает что-то похожее на C. Почему? Потому что закостеневшие мозги не осиливают «птичий» синтаксис, будь он хоть кристально чист и логичен.
Тип явно и недвусмысленно указан в той же строчке. Чего еще надо?
Ничего подобного, указано выражение, можно конечно для простых случаев не писать тип - и так видно что получится, а для сложных писать, но это будет говноподходом.
Окей, забудем про дженерики, контейнеры, макросы и прочее - это слишком сложно. Возьмем простое - «let data = CollectMetadata();», каким уровнем телепатии надо обладать, чтоб разгадать тип переменной data?
Каким уровнем телепатии надо обладать, прежде чем написать в С++ «const Metadata data = CollectMetadata();». Когда ты узнал, какой тип возвращает функция?
const auto data = CollectMetadata();
const Metadata data = CollectMetadata();
let data = CollectMetadata();
let data: Metadata = CollectMetadata();
Эксперты в треде ничего о Rust не знают, но отвечают
Раскрой мысль. Где ты нашёл GC в расте? Во первых, сейчас его убрали. Во вторых, он если и будет, то опционально (формально и в С++ есть кое-какие костыли для реализации GC). Правда не видишь разницы с D, где если мы решаем не использовать GC, то и стандартная библиотека отваливается?
Подсчёт ссылок - не GC.
Ну и если что, то я не эксперт и не претендую. Хотя язык изучаю понемногу. Вероятно, попробую что-то для себя на нём писать.
А чем ужасны растовские макросы? Я их правда поверхностно смотрел пока что. В любом случае, С++ тут взамен может только больший ужас предложить. Который ещё и не будет полноценной заменой.
Во вторых, зачастую нужны именно иммутабельные данные, и у нас уже получается:
const Point p( 1, 1 );
let p = Point { x: 0i, y: 0i };
Принципиальная разница только в том, что имена полей надо явно указывать. Лично я тоже на этом моменте удивился, что нельзя их опускать, если инициализируем в «правильном порядке». Ну да, так мы избегаем некоторых потенциальных ошибок... но аргумент про функции справедлив.
Впрочем, в С ведь так (указывать имена полей) можно. Видел предложения и в С++ так сделать...
Да, но анониму как раз не хватает указаний типов. В том и дело, что это две крайности. Если по уму, то кое-где тип лучше указать. А во многих местах он ничего не проясняет.
Эволюция движется не «самыми красивыми» в теории, а «самыми приспособленными» к «здесь» и «щас», в котором и живут обычные люди :) (и если у кого-то все еще возникает «WTF?» по поводу как так получилось - он чего-то упускает... или игнорирует. Некоторые, например, думают, что на человеков эволюция больше не действует... Ну, в общем они правы, только у них теперь внутривидовая социальная конкуренция - и на ярмарке ЯП тоже :))