Оцените прошедший день
Final Results
20%
+2 (прекрасно)
20%
+1
25%
0 (нейтрально)
15%
-1
20%
-2 (ужасно)
Оцените прошедший день
Final Results
15%
+2 (прекрасно)
23%
+1
34%
0 (нейтрально)
10%
-1
18%
-2 (ужасно)
Оцените прошедший день
Final Results
21%
+2 (прекрасно)
26%
+1
15%
0 (нейтрально)
13%
-1
26%
-2 (ужасно)
Оцените прошедший день
Final Results
14%
+2 (прекрасно)
15%
+1
35%
0 (нейтрально)
14%
-1
22%
-2 (ужасно)
2022-06-29_02-21.png
45.5 KB
Оказывается в расте можно делать функции, для который скобки опциональны!
Кто-нибудь сможет разгадать, как такое повторить? 👀
Кто-нибудь сможет разгадать, как такое повторить? 👀
2022-06-29_02-46.png
33.2 KB
Можно даже асинхронные функции таким же образом определять!
Но, к сожалению, только на найтли.
Но, к сожалению, только на найтли.
Очевидная часть:
Для асинхронной версии всё тоже самое,
А дальше нужно две хитрости, чтобы всё это довести до конца :)
Хитрость #1:есть хак, позволяющий эмитировать , т.е. сделать структуру без полей но с дженериком. хак заключается в создании енама где используется в нежилом варианте.
Хитрость #2: можно реализовать для своего типа, таким образом его можно будет вызвать через , без использования найтли фич.
Вот реализация: [play]
for цикл вызывает into_iter метод на значении после in. Соответственно надо каким-то образом сделать так, чтобы iter::<T> и iter::<T>() (и версии без турборыбы) имели значение, которое реализует IntoIterator или Iterator.Для асинхронной версии всё тоже самое,
.await вызывает метод into_future, соответственно нужно чтобы fut::<T>, fut и т.д. имели значение реализующее IntoFuture или Future.А дальше нужно две хитрости, чтобы всё это довести до конца :)
Хитрость #1:
PhantomDataTDeref<Target = fn() -> Iter<T>>()А более подробное объяснение можно прочитать в моём блоге :)
https://ihatereality.space/08-abusing-rust-traits-to-write-silly-things/
https://ihatereality.space/08-abusing-rust-traits-to-write-silly-things/
blog.ihatereality.space
(Ab)using Rust traits to write silly things
Explaining how to make a function that is callable with and without parentheses
Оцените прошедший день
Final Results
17%
+2 (прекрасно)
17%
+1
19%
0 (нейтрально)
19%
-1
29%
-2 (ужасно)
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.
теперь это моя любимая новость
> "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.
теперь это моя любимая новость
Forwarded from я что-то �� и всё ����
Этому миру нужен принтер от Pine64
Rust 1.62 tl;dr [blog] [gh release]:
—
—
— Мьютексы теперь тоньше и быстрее на линуксе! вместо
— стабилизированы следующие 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
—
— В clippy добавили линт предупреждающий о неожиданно позднем дропе временных значений в
[2]: это про
—
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()) компилируется (и теперь даже без предупреждений).Оцените прошедший день
Final Results
16%
+2 (прекрасно)
20%
+1
34%
0 (нейтрально)
13%
-1
18%
-2 (ужасно)
я вообще иногда кидаю мемы для одного человека в канал(ы) с не менее чем 11-тью людьми