мне не нравится реальность
505 subscribers
1.33K photos
57 videos
56 files
1.02K links
Мне не нравится реальность
N.B. waffle is unhinged

- кормить назад: @meowaffle
- кормить вперёд: github.com/sponsors/WaffleLapkin
- чят: https://xn--r1a.website/+5Dtuan4dVE5kYTcy
- блог: blog.ihatereality.space
Download Telegram
Я подмёлся в своей комнате впервые за два месяца :')
:>

(вафель когда код притворяется что работает)
2022-06-29_02-21.png
45.5 KB
Оказывается в расте можно делать функции, для который скобки опциональны!

Кто-нибудь сможет разгадать, как такое повторить? 👀
2022-06-29_02-46.png
33.2 KB
Можно даже асинхронные функции таким же образом определять!

Но, к сожалению, только на найтли.
Очевидная часть: for цикл вызывает into_iter метод на значении после in. Соответственно надо каким-то образом сделать так, чтобы iter::<T> и iter::<T>() (и версии без турборыбы) имели значение, которое реализует IntoIterator или Iterator.

Для асинхронной версии всё тоже самое, .await вызывает метод into_future, соответственно нужно чтобы fut::<T>, fut и т.д. имели значение реализующее IntoFuture или Future.

А дальше нужно две хитрости, чтобы всё это довести до конца :)

Хитрость #1: есть хак, позволяющий эмитировать PhantomData, т.е. сделать структуру без полей но с дженериком. хак заключается в создании енама где T используется в нежилом варианте.

Хитрость #2: можно реализовать Deref<Target = fn() -> Iter<T>> для своего типа, таким образом его можно будет вызвать через (), без использования найтли фич.

Вот реализация: [play]
Occult club registration rejected after complaint it may summon Satan to University of Adelaide

> "Even if we did want to summon Satan, it's not against university or union policy to do so, so it's still not really grounds to reject us," Adelaide University Occult Club president Ashley Towner said.

теперь это моя любимая новость
2022-06-30_20-02.png
24.1 KB
кто заметит в чём проблема?
Forwarded from я что-то �� и всё ����
Этому миру нужен принтер от Pine64
Rust 1.62 tl;dr [blog] [gh release]:

cargo add теперь есть из коробки
#[derive(Default)] теперь работает на enum'ах! для выбора дефолтного варианта используется #[default] аттрибут
— Мьютексы теперь тоньше и быстрее на линуксе! вместо pthread реализации Mutex, Condvar и RwLock теперь используют futex [1]
— стабилизированы следующие API:
bool::then_some
f32::total_cmp
f64::total_cmp
Stdin::lines
windows::CommandExt::raw_arg
impl<T: Default> Default for AssertUnwindSafe<T>
From<Rc<str>> for Rc<[u8]>
From<Arc<str>> for Arc<[u8]>
FusedIterator for EncodeWide
RDM intrinsics on aarch64
mutable_borrow_reservation_conflict линт убрали, теперь такой код паттерн считается полностью валидным [2]
— В clippy добавили линт предупреждающий о неожиданно позднем дропе временных значений в match

[1]: pthread локи поддерживают больше фич чем локи из раста, что добавляет лишний оверхед. Например реализация мьютекса занимает 40 байт и её нельзя двигать, из-за чего std приходилось боксить внутренний мьютекс. Новая реализация требует всего 5 байт и не требует боксинга. Так-же это позволило сделать Mutex::new константной функцией (но это изменение не вошло в 1.62 релиз)

[2]: это про vec.push(vec.len()) и подобное — push требует уникальную ссылку, len шареную, в очевидном рассахаривании это бы привело к проблеме:
let tmp0 = &mut vec;
let tmp1 = &vec; // borrow conflict
let tmp2 = Vec::len(tmp1);
Vec::push(tmp0, tmp2);

Компилятор это решает так называемыми "two-phase borrows", уникальная ссылка на vec изначально берётся не как уникальная, а как "two-phase" которая превращается в уникальную ("активируется") при первом использовании. Пока ссылка не активирована (=> не использовалась) она не конфликтует с другими ссылками и поэтому пример vec.push(vec.len()) компилируется (и теперь даже без предупреждений).
я вообще иногда кидаю мемы для одного человека в канал(ы) с не менее чем 11-тью людьми
а вот такая мой канал мои правила шитпосты