Pull to refresh

Comments 30

Хотел как-то посмотреть, как выглядят production-ready проекты на Rust. Похоже, многие проекты, которые можно найти на github, делались для изучения языка и впоследствие забрасывались. Можете порекомендовать что-нибудь production-ready и кем-нибудь реально использующееся на Rust?

Спасибо за пример проекта, и отдельно — за статью с обзором!

И правда, с чего я решил что вопрос про исходные коды этих проектов? :(

хм! нет, это немного не то, учитывая, что раст возник в мозиллы от потребностей мозиллы. что есть стороннего, независимого?
то есть суть вопроса — взлетит или нет? го, шарп, цпп, или всё-таки раст? может всё-таки котлин во все поля?
имхо, вы сейчас перечислили языки с достаточно сильно разными областями применения, если вам хватает kotlin, то скорее всего вам не нужен rust/cpp
завидую такой уверенности в оценках чужих потребностей.
мне хватает шарпа, ц\цпп и спецязыков на работе и ещё жабы немного. интересен котлин в степени уже бОльшей, чем некоторое время назад был интересен го. а гоу был интересен тем, что на нём достаточно просто создавать лёгкие сервисы с переносимым кодом. в котлин можно уже всё, включая андроид во все поля. можно ли котлин в сервисы с переносимым кодом так же, как в го — пока не понял.
так что пока смотрю на раст ровно так же, как на го, но знаю при этом, что у го история успеха толще.
Вопрос не в популярности сейчас. Пишут, что Dropbox запустил новое хранилище на Rust. OneSignal запустил push нотификацию со 100 000 tps на Rust. Samsung вкладывает в разработчиков компилятора Rust.
Rust попал в нишу. По мне так Rust надежнее C++ (искать баги проще уже при компиляции) и нет дурацкого GC который есть в Go, Java, C#, Kotlin, D…
У меня чувство дежавю. Два года назад Dropbox переписывал хранилища на Go, а vk запускали на нём push нотификацию. Go тогда попал в нишу.
Дело как раз в том, что код хранилища DropBox, написанный на Go, ужасно тормозил. Они его переписали на Rust, и теперь он летает. Они писали об этом в блоге.
Дело в том, что код Dropbox был написан на python и ужасно тормозил. Они его переписали на Go и стало всё летать. Они писали об этом https://blogs.dropbox.com/tech/2014/07/open-sourcing-our-go-libraries/
Вот тут лучше описано. Я тоже был не совсем прав — Го жрал слишком много памяти, поэтому переписали на Rust:
https://www.wired.com/2016/03/epic-story-dropboxs-exodus-amazon-cloud-empire/
> Этот выпуск включает первый черновой вариант второго издания в нашей онлайн документации. 19 из 20 глав уже написаны, черновой вариант 20 главы будет добавлен в выпуске Rust 1.19.

А есть pdf-версия этой версии?

Я собираюсь как-нибудь потыкать Rust, но меня снедают разные сомнения. Вот я хотел спросить об одном — может, кто-нибудь сможет его развеять. Как продвигаются дела с non-lexical borrow? Я просто слышу звон, и у меня есть впечатление, что когда это наконец появится, то стиль кода сильно изменится. Меня это здорово сдерживает — поскольку тыкать собирался не по какой-то необходимости а так, попробовать тёплая ли водичка, то хочется уже сразу писать идиоматично. Вместо этого есть ощущение, что сейчас придётся пробовать poor man's Rust, а уж потом, когда появится non-lexical borrow, вот тогда заживём и наконец я пойму, что такое идиоматичный код. По делу беспокоюсь, или мерещится?

Насколько я понимаю, принципиально ничего не изменится. Да и специально задумываться об этом, вроде, не приходится. То есть, иногда компилятор бьёт по рукам за код, который вполне мог бы быть корректным — приходится исправлять.

Самое неприятное, что мне встречалось — ситуация, когда нужно написать функцию, возвращающую ссылку на объект в контейнере, если он там есть, или добавляющую новый элемент и возвращающую ссылку на него.


Этот код не компилируется, так как время жизни возвращаемой ссылки включает весь код функции, в том числе и self.insert(...). То есть компилятор считает, что self менять нельзя даже после return v;, поскольку его часть всё ещё позаимствована возвращаемой ссылкой v.


fn get<T>(&mut self, key: &T) -> &u32 {
    if let Some(v) = self.find(key) {
        return v;
    }
    self.insert(key, 0)
}

Сейчас советуют использовать два вызова find, что, конечно, менее эффективно:


fn get<T>(&mut self, key: &T) -> &u32 {
    if self.find(key).is_none() {
        return self.insert(key, 0);
    }
    self.find(key).unwrap()
}
Посмотрите, как это делается в стандартной библиотеке:
https://doc.rust-lang.org/src/core/option.rs.html#667
https://doc.rust-lang.org/std/collections/hash_map/enum.Entry.html#method.or_insert

Entry API как раз и было введено, чтобы решить эту проблему.

И касательно времени жизни, вам должно помочь оборачивание if-блока в фигурные скобки:
fn get<T>(&mut self, key: &T) -> &u32 {
    {
        if let Some(v) = self.find(key) {
            return v;
        }
    }
    self.insert(key, 0)
}

Не так красиво, но время жизни закончится там, где надо.
Очень надеюсь, что у Мозиллы все будет хорошо, либо же кто-то из гигантов заметит язык и начнет использовать и вкладывать в него.
Через месяц буквально сложности с borrow checker'ом уходят вообще на второй план и даже не задумываешься. Жутко не хватает готовых библиотек, кусков кода. В документации иногда вообще непонятно, что делать с той или иной библиотекой.

После С++ это как глоток свежего воздуха в этой нише.

А для проектов типа Diesel или Rocket всё ещё нужна Nightly-сборка? Те расширения языка, которые они используют (кодогенерация во все поля) собираются стандартизировать?

Diesel компилируется с Rust 1.17. Rocket все еще требует nightly. Потихоньку все это стабилизируется (процедурные макросы, например, были стабилизированы то ли в прошлой, то ли в позапрошлой версии)

процедурные макросы, например, были стабилизированы то ли в прошлой, то ли в позапрошлой версии

В 1.15 там же только "custom derive" был стабилизирован. Насколько я помню, полная стабилизация процедурных макросов это еще дело очень далекого будущего.

Но для diesel и serde и эта часть уже вполне хлеб.

Sign up to leave a comment.

Articles