1.83K subscribers
3.3K photos
132 videos
15 files
3.58K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
#prog #rust #article

Simplifying endianness sensitive file parsers in Rust with Omnom

Статья о том, как, эксплуатируя вывод типов в Rust, писать код для разбора бинарных значений, поменьше упоминая порядок байт.
Мерлин, когда ты там уже чай заваришь, а?
Forwarded from rusta::mann
Начинает казаться, что выделение новичков в отдельный новичковый чат было ошибкой нашего ру комьюнити.

Всё чаще наблюдаю, что в новичковом чате сидят и отвечают такие же новички, как те, что задают вопросы -- и в итоге получилась эхо-камера неверных, но очень уверенных догадок.

А опытные ребята, которые, по задумке, должны были отвечать на новичковые вопросы, видимо, устали от новичков, которые не читают растбук, и перестали активно участвовать в обсуждениях -- врываются только когда бредометр начинает зашкаливать.

Решения у меня, правда, нет -- активно модерировать мейн чтобы "атцы" новичков не обижали за глупые вопросы ресурсов и желания не хватит.
#rust

Коллекция книг по разным аспектам Rust, включая неофициальные и руководства по отдельным крупным либам, вроде serde
Forwarded from You Had No Job
If you don't like me at Олимп
Then you don't deserve my дофамин
#prog #rust

Набор постов (считай, книга), посвящённый пошаговой реализации на Rust текстового редактора
This media is not supported in your browser
VIEW IN TELEGRAM
Кажется, на мой канал кто-то положил болт
#prog #rust #parsing #rustlib

fast_float — библиотека для быстрого парсинга чисел с плавающей точкой. Судя по бенчмаркам, быстрее lexical_core, да и вообще практически всех библиотек.

Является портом одноимённой библиотеки для C++ за авторством небезызвестного Даниела Лемира.
#prog #rust #parsing #rustlib

nom_supreme — библиотека, расширяющая функционал nom. Новые комбинаторы-методы, очень подробный тип ошибок, функция для быстрого создания парсера любого типа, реализующего FromStr и ещё по мелочи.

В примерах используется cool_asserts — библиотека для более пригодных для использования в #[test]-функциях ассертов.
#prog #rust

Пара слов о трейте Copy.

Во-первых, это один из "магических" трейтов, помечен атрибутом #[lang = "copy"]. Компилятор проверяет, что если тип тем или иным способом задекларирован как Copy, то и всего его поля должны быть Copy. Следующий код не компилируется:

#[derive(Clone, Copy)]
struct StringHolder(String);

Ошибка:

error[E0204]: the trait `Copy` may not be implemented for this type
--> src/lib.rs:1:17
|
1 | #[derive(Clone, Copy)]
| ^^^^
2 | struct StringHolder(String);
| ------ this field does not implement `Copy`

Во-вторых, один и тот же тип не может реализовывать Copy и Drop одновременно. Скажем, следующий код не компилируется:

#[derive(Clone, Copy)]
struct Primitive;

impl Drop for Primitive {
fn drop(&mut self) {}
}

Ошибка:

error[E0184]: the trait `Copy` may not be implemented for this type; the type has a destructor
--> src/lib.rs:1:17
|
1 | #[derive(Clone, Copy)]
| ^^^^ Copy not allowed on types with destructors

Так как полноценных negative trait bounds в Rust всё ещё нет, ограничение Copy можно использовать как более сильную замену ограничению !Drop.

В-третьих, как сказано в документации к Copy, "Copies happen implicitly, for example as part of an assignment y = x. The behavior of Copy is not overloadable; it is always a simple bit-wise copy.". С другой стороны, Clone является супертрейтом Copy, и наличие реализации Copy не мешает вызывать .clone() явно. Однако, в отличие от Copy, Clone::clone в принципе может вызывать любой код. Поэтому, в частности, технически замена в итераторной цепочке .cloned() на .copied() является ломающим изменением, даже если элементы итератора реализуют Copy.

Продемонстрирую на примере:

use std::cell::Cell;

struct Counter<'a>(&'a Cell<u32>);

impl Clone for Counter<'_> {
fn clone(&self) -> Self {
self.0.set(self.0.get() + 1);
Self(self.0)
}
}

fn main() {
let n = Cell::new(0);
let arr = [Counter(&n), Counter(&n), Counter(&n)];
arr.iter().cloned().for_each(drop);
println!("`Counter::clone` called {} times", n.get());
}

Если запустить этот код, то он напечатает `Counter::clone` called 3 times. Теперь добавим к определению Counter аннотацию #[derive(Copy)] и допишем в main тот же код, что там есть, но с заменой .cloned() на copied():

fn main() {
// ...

let n = Cell::new(0);
let arr = [Counter(&n), Counter(&n), Counter(&n)];
arr.iter().copied().for_each(drop); // изменение в этой строке
println!("`Counter::clone` called {} times", n.get());
}

Код теперь выводит:

`Counter::clone` called 3 times
`Counter::clone` called 0 times

Берегите себя и не пишите, пожалуйста, в Clone::clone что-то помимо собственно клонирования.
Forwarded from Jem
#prog

Поддерживаю, статья интересная
Forwarded from Linker Unsafe
Довольно увлекательная статья о том, как человек участвовал в RAIC 2020. В этот раз необходимо было запрограммировать бота для игры в сильно упрощённый Старкрафт.
Человек решил офигенное количество с виду простых задач по разруливанию поведения юнитов на поле. И когда казалось, что все возможные грабли учтены, оказывалось, что находилась ещё ситуация (и не одна!), когда алгоритм действовал не лучшим образом.

Например,
Еще одной важной проблемой, которая не давала покоя было то, что когда мои лучники и лучники противника сближались, и становились стенка против стенки, то новые лучники подходили сзади и подпирали их. Таким образом они были абсолютно неэффективны, т.к. просто стояли и ничего не делали. И так могло накопиться много слоев моих лучников. Это выглядело как явная тактическая ошибка.

В-общем, стоящая статья, я получил удовольствие от прочтения. Краткий вывод:
1. Для участия в RAIC 2021 нужно уволиться с работы или взять отпуск месяца на 2 😊
2. Большинство задач тривиальны, но обобщённое и эффективное решение части из них позволяет разом убить 100 "зайцев" и избавиться от костылей в будущем.
3. Для участия не нужно иметь опыт в AI, ML, DL и других аббревиатурах, нужно просто уметь писать if-ы и циклы😉, но желательно уметь дебажить и профилировать код.

https://m.habr.com/ru/post/535310/