Основная «проблема» rust, по-моему, как раз в том, что этот ЯП был призван устранить - по принципу «за что боролись, на то и напоролись» -, и не позволяет писать говнокод легко и непринужденно.
Рассмотрим элементарный пример с доступом к аргументам командной строки. Иногда, для быстрого прототипирования утилитки не хочется сразу использовать полноценный разбор командной строки, с привлечением библиотеки - пусть даже стандартной.
На C можно представить такой код:
#include <stdio.h>
int main(int argc, char **argv)
{
printf("%s\n", argv[1]); // здесь может быть какой-нибудь do_something(argv[1]), что именно не суть важно, но что-то определенно полезное
}
Тем временем, на расте придется писать вот так:
use std::env;
fn main() {
let args: Vec<String> = env::args().collect(); // ???
println!("{}", args[0]);
}
Это очень слегка измененный пример из документации с rust-lang.org. Я даже не рассматриваю этот, на мой взгляд не к месту кулхацкерский, стиль экономии на переводах строки, а остановлюсь на «коллекционировании» аргументов коммандной строки.
Зачем мне создавать целый новый вектор? Только чтобы перейти от «сырого» массива строк к типо-безопасной структуре? Почему нельзя было предоставить какой-то упрощенный интерфейс, пусть даже если доступен только начальный итератор. Что-то типа такого:
use std::env;
fn main() {
println!("{}", env::args() + 1); // если аргументов не передано, просто валимся с какой-нибудь паникой
}