Мой Hello world на rust
Jul 12, 2015 10:15 · 472 words · 3 minute read
Итак, у меня наконец-то появилось немного свободного времени, а значит пришло время попробывать rust. Давно хотел познакомиться с этим языком, т.к. разработчики обещают очень много плюшек: безопасный код, компилируемый в нативный, под кучу архитектур, интегрируемый с C/C++… В общем, попробовать стоит! В качестве туториала взял статью на Хабре.
Установка
В репозитории ubuntu 14.04 пакета с именем rust не нашлось. Странно, вроде уже не молодой язык… Хотя там проблемы совместимости были до версии 1.0, ну да ладно. В конце концов есть как сторонний ppa, так и архивы. Я поставил не только rust-stable, но и cargo-nightly. Последний - менеджер пакетов, который совмещает в себе и систему сборки/запуска. Думаю, здесь проблем не возникнет, так что двигаемся дальше.
Hello world
Осилил все примеры из статьи, указанной в самом начале, и вот какие выводы сделал.
Компилятор ваш друг. Он будет помогать во всём: неиспользуемые переменные, неявное приведение типов, выход за границы домена, попытка изменения неизменяемой переменной… Ошибок много, но все по делу. Мне кажется, что со временем слежение за этими вещами войдёт в привычку.
Многословность. Тут уже принцип “явное лучше неявного” раскрылся во всей красе. Как вы думаете, как определить переменную в rust? Очень просто:
let mut some_variable: u32 = 0;
?!?!?!? Расшифровываю: пусть переменная (let) будет изменяемой (mut) называться (some_variable), иметь тип (u32) и равняться 0. По умолчанию переменная иммутабельна, это rust взял из функциональных языков. За такими переменными проще следить, безопасно передавать в потоки (кстати, rust умеет реализовать модель акторов). Чем же они отличаются от констант? Чисто теоретически в них можно не указывать тип, и он будет выведен из присваевомого выражения. Но у нас же “явное лучше неявного”, так что давайте указывать тип везде! :)
Кстати, по поводу типов. Они тут тоже есть:
type MagicPower = u16;
let run: MagicPower = 7800;
Мне нравится такай работа с доменами, можно свои понятные типы описывать. Вот только приведение типов выполняется исключительно явно:
let f2 = 3.14;
let some_var = f2 as u32; // будет обрезано до значения 3
Да-да, типы можно не указывать, rust постарается их сам вывести.
Ещё мне очень понравилась идея скоупов. Можно явно объявить блок, в котором переменные никак не будут взаимодействовать с внешним миром. Хорошо это или плохо? Не знаю, надо попробовать применить на практике. Далее в статье описывается работа с указателями - ничего нового за исключением того, что надо следить какие переменные изменяемые, а какие нет, но в этом нам поможет наш друг компилятор :).
Ещё следует отметить:
- Простоту взаимодействия с C++. А как же безопасный код? Нууу, вы можете явно пометить код как unsafe и писать там хоть на ассемблере - rust туда со своими проверками не полезет;
- Отсутствие классов. Есть только структуры и функции, подмешиваете вторые к первым - получаете объекты. Не сказать, что это удобно, но, видимо, тренд такой (аналогично в Go);
- Отсутствие исключений.
Засим всё, поживём - увидим взлетит ли :) Ну а пока можно почитать русскую документацию.