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

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

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Почему программисты, использующие динамически типизированные ЯП, не смотрят в сторону статически типизированных? Потому что статическая типизация нарезает круги вокруг динамической, и у тех, кто пытается следить за первым, начинает кружиться голова
🤔16🤮2👍1
Никто:
вафель: *забывает что в #![no_std] нет тредов*
👎4👍1
Forwarded from RWPS::Mirror
🔥30😢1
Арена — это место, на котором ты сходишься в схватке с борроу-чекером
🤔10😁1
Forwarded from Life of Tau
вы водитель категории
Anonymous Poll
11%
c
13%
c#
22%
c++
53%
coca-cola
В русскоязычном Телеграм-сообществе повторяется история от 22 ноября?
👎1🤔1
#prog #meme

(точнее, и не мем даже, а суровая правда жизни)
😱3
😁13🤯3💩3👍1
#prog #rust

Хозяйке на заметку

Иногда таки возникает такая задача: взять мутабельные ссылки на два элемента слайса. В лоб написать let (x, y) = (&mut arr[i], &mut arr[j]); не получится — borrow checker не даст. И тут есть два пути.

Первый — обойтись исключительно safe-кодом. В этом случае мы разделяем слайс по индексам и вынимаем ссылки на концы сегментов. Вот один из способов, как это можно сделать:

fn get_two_mut<T>(
arr: &mut [T],
idx1: usize,
idx2: usize,
) -> (&mut T, &mut T) {
let (ifirst, isecond) = (
idx1.min(idx2),
idx1.max(idx2),
);
let (first, last) = match &mut arr[ifirst..=isecond] {
[first, .., last] => (first, last),
_ => panic!("overlapping indices"),
};
if ifirst == idx1 {
(first, last)
} else {
(last, first)
}
}

Это рабочее решение, но тут многовато операций, да и перестановка ссылок в соответствие с индексами выглядит некрасиво.

Другой путь — это использовать немного unsafe, чтобы обойти ограничения borrow checker-а:

fn get_two_mut<T>(
arr: &mut [T],
idx1: usize,
idx2: usize)
-> (&mut T, &mut T) {
assert_ne!(idx1, idx2);
let a: *mut T = &mut arr[idx1];
let b: *mut T = &mut arr[idx2];
unsafe { (&mut *a, &mut *b) }
}

Что же делает эту реализацию sound?

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

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

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

Можете использовать этот код без ограничений.
👍7
Поздравляю коллегу по цеху, так сказать
В рот мне декоратор! Сегодня мне написали товарищи с Хабра - я, оказывается, победил в технотексте-2021 со своей статьёй про собеседование в Яндекс 🤷‍♂ И пока я жду грузовики, наполненные доверху бабосами (хотя, кажется, подарят всё-таки просто толстовку), продолжаю писать новую статью. Писать статьи сложно, и, к сожалению, идей у меня значительно больше, чем сил для их написания. Ну штош... Дорогу осилит идущий.

https://habr.com/ru/post/550088/
👍3
#prog #scala #article

Есть статья от Олега Нижника об экспериментальной новой фиче в Scala 3 — capture checking, опубликованная 14 февраля.

Есть OTUS, которая на Хабре известна своими многочисленными дерьмовыми переводами.

Что мы получим, если их соединим?

Комедию в двух актах!

Акт первый (перевод статьи от OTUS от 5 марта, с плохим переводом).

Акт второй (перевод той же самой статьи от OTUS от 7 июня, с другим, но всё ещё плохим переводом).

Клоуны, блин. 🤡
😁5
$ cargo branch -d cleanup

#трудовыебудни
🤯2😁1
Forwarded from Bad Pixel
👍15💩1