Мой Hello world на rust

Jul 12, 2015 10:15 · 472 words · 3 minute read hello world rust

Итак, у меня наконец-то появилось немного свободного времени, а значит пришло время попробывать 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);
  • Отсутствие исключений.

Засим всё, поживём - увидим взлетит ли :) Ну а пока можно почитать русскую документацию.