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

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

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
мне уже несколько раз прислали эту ссылку, так что придется делиться — однострочная команда для Windows, которая приводит к разрушению индекса папок и файлов на дисках NTFS, и данные могут быть потеряны. в теории может быть доставлена на компьютер разными способами, но Microsoft, даже зная о ней, не исправляет её.

don’t try this at home

https://www.bleepingcomputer.com/news/security/windows-10-bug-corrupts-your-hard-drive-on-seeing-this-files-icon/
#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 что-то помимо собственно клонирования.